一、解決 This is probably not a problem with npm. There is likely additional logging output above
在執行 npm run serve 運行項目的時候報錯:
npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! lianshan@2.0.0 serve: `vue-cli-service serve` npm ERR! Exit status 1 npm ERR! npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /Users/.../_logs/..._10_01_084Z-debug.log
如果出現這種報錯情況,一般需要重新安裝 node_modules 文件夾中的內容,但是在安裝前,要把之前的內容都清空掉。
其實大多數的主要問題是 package-lock.json 這個文件,一般使用 1、2、4 步就夠了,如果不行在重新 1、2、3、4 步,因為使用了 第3步,在 $ npm install 安裝會要點時間,相對較慢。
解決步驟如下:
1、首先刪除 node_modules,可以命令行刪除,也可以手動右鍵刪除文件夾。
2、刪除 package-lock.json 文件
3、運行命令
npm cache clean --force
4、重新安裝依賴:npm install
二、npm模塊安裝機制
1、npm install 安裝之前,npm install
會先檢查node_modules
目錄之中是否已經存在指定模塊。如果存在,就不再重新安裝了,即使遠程倉庫已經有了一個新版本,也是如此。
如果你希望,一個模塊不管是否安裝過,npm 都要強制重新安裝,可以使用-f
或--force
參數。
npm install <packageName> --force
2、如果想更新已安裝模塊,就要用到npm update
命令。
npm update <packageName>
它會先到遠程倉庫查詢最新版本,然后查詢本地版本。如果本地版本不存在,或者遠程版本較新,就會安裝。
3、那么npm update
命令怎么知道每個模塊的最新版本呢?
答案是 npm 模塊倉庫提供了一個查詢服務,叫做 registry 。以 npmjs.org 為例,它的查詢服務網址是 https://registry.npmjs.org/
。
這個網址后面跟上模塊名,就會得到一個 JSON 對象,里面是該模塊所有版本的信息。比如,訪問 https://registry.npmjs.org/react
,就會看到 react 模塊所有版本的信息。
它跟下面命令的效果是一樣的。
npm view react // npm view 的別名
npm info react npm show react npm v react
registry 網址的模塊名后面,還可以跟上版本號或者標簽,用來查詢某個具體版本的信息。比如, 訪問 https://registry.npmjs.org/react/v0.14.6 ,就可以看到 React 的 0.14.6 版。
返回的 JSON 對象里面,有一個dist.tarball
屬性,是該版本壓縮包的網址。
dist: { shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a', tarball: 'http://registry.npmjs.org/react/-/react-0.14.6.tgz' },
到這個網址下載壓縮包,在本地解壓,就得到了模塊的源碼。npm install
和npm update
命令,都是通過這種方式安裝模塊的。
4、緩存目錄
npm install
或npm update
命令,從 registry 下載壓縮包之后,都存放在本地的緩存目錄。
這個緩存目錄,在 Linux 或 Mac 默認是用戶主目錄下的.npm
目錄,在 Windows 默認是%AppData%/npm-cache
。通過配置命令,可以查看這個目錄的具體位置。
PS D:\modb-front\modb-front> npm config get cache D:\Program\nodejs\node_cache
瀏覽一下這個目錄,會看到里面存放着大量的模塊,儲存結構是{cache}/{name}/{version}
npm cache ls react ~/.npm/react/react/0.14.6/
~/.npm/react/react/0.14.6/package.tgz ~/.npm/react/react/0.14.6/package/
~/.npm/react/react/0.14.6/package/package.json
每個模塊的每個版本都有一個自己的子目錄,里面是代碼的壓縮包package.tgz
文件,以及一個描述文件package/package.json
。
除此之外,還會生成一個{cache}/{hostname}/{path}/.cache.json
文件。比如,從 npm 官方倉庫下載 react 模塊的時候,就會生成registry.npmjs.org/react/.cache.json
文件。
這個文件保存的是,所有版本的信息,以及該模塊最近修改的時間和最新一次請求時服務器返回的 ETag 。
{ "time":{ "modified":"2016-01-06T23:52:45.571Z", // ...
}, "_etag":"\"7S37I0775YLURCFIO8N85FO0F\"" }
對於一些不是很關鍵的操作(比如npm search
或npm view
),npm會先查看.cache.json
里面的模塊最近更新時間跟當前時間的差距,是不是在可接受的范圍之內。如果是的,就不再向遠程倉庫發出請求,而是直接返回.cache.json
的數據。
5、模塊的安裝過程
Node模塊的安裝過程是這樣的:
1、發出npm install
命令
2、npm 向 registry 查詢模塊壓縮包的網址
3、下載壓縮包,存放在~/.npm
目錄
4、解壓壓縮包到當前項目的node_modules
目錄
注意,一個模塊安裝以后,本地其實保存了兩份。一份是~/.npm
目錄下的壓縮包,另一份是node_modules
目錄下解壓后的代碼。
但是,運行npm install
的時候,只會檢查node_modules
目錄,而不會檢查~/.npm
目錄。也就是說,如果一個模塊在~/.npm
下有壓縮包,但是沒有安裝在node_modules
目錄中,npm 依然會從遠程倉庫下載一次新的壓縮包。
這種行為固然可以保證總是取得最新的代碼,但有時並不是我們想要的。最大的問題是,它會極大地影響安裝速度。即使某個模塊的壓縮包就在緩存目錄中,也要去遠程倉庫下載,這怎么可能不慢呢?
另外,有些場合沒有網絡(比如飛機上),但是你想安裝的模塊,明明就在緩存目錄之中,這時也無法安裝。
6、--cache-min
參數
為了解決這些問題,npm 提供了一個--cache-min
參數,用於從緩存目錄安裝模塊。
--cache-min
參數指定一個時間(單位為分鍾),只有超過這個時間的模塊,才會從 registry 下載。
npm install --cache-min 9999999 <package-name>
上面命令指定,只有超過999999分鍾的模塊,才從 registry 下載。實際上就是指定,所有模塊都從緩存安裝,這樣就大大加快了下載速度。
參考文章:http://www.ruanyifeng.com/blog/2016/01/npm-install.html