Tips:javascript
- webpack能夠全局安裝或者本地安裝。官網上不推薦全局安裝,由於這會將你項目中的 webpack 鎖定到指定版本,而且在使用不一樣的 webpack 版本的項目中,可能會致使構建失敗。
- 全局和局部都安裝webpack,這樣命令行內直接使用webpack命令,使用的是全局的,npm運行的是局部的webpack
- 全局安裝是爲了能夠在命令行中使用webpack,項目安裝是爲了讓項目發佈後,其餘人能夠在直接使用npm命令時使用與你相同版本的webpack。
$ npm install -g webpack
全局安裝的包都在 /usr/local/lib/node_modules 文件夾下(OS X)。安裝後可執行文件默認放在/usr/local/bin,庫文件默認放在/usr/local/lib,配置文件默認放在/usr/local/etc。bin目錄通常存編譯好的dll庫文件和可執行文件,bin是二進制binrary的英文縮寫。(查看bin目錄下是各類軟連接,git,npm等)
通常有三種可能:html
多是環境變量配置的緣由,嘗試的解決方式和結果:java
export NODE_PATH="/usr/local/lib/node_modules"
, 後在項目根目錄運行webpack,仍然報錯。在項目根目錄下輸入指令 echo $NODE_PATH 輸出結果爲空。export NODE_PATH="/usr/local/lib/node_modules"
後在項目根目錄運行webpack,成功!在項目根目錄下輸入指令 echo $NODE_PATH 能輸出結果。 export NODE_PATH="/usr/local/lib/node_modules"
,保存退出。$ npm install webpack --save-dev
Tips:node
局部 npm install 安裝包以前,須要在當前目錄下執行
初始化
。也就是說當前目錄必須有package.json文件,或者你在當前的目錄下人爲的創建好node_modules目錄。webpack
- 項目中只有package.json,文件內容不能爲空,不能爲
null
,至少應該包含一個{}
,會如指望安裝,安裝完成後會生成node_modules文件夾,package.json中新增devDependencies。- 項目中只有node_modules文件夾,能夠正常下載到文件夾中,不會生成package.json,可能會生成package-lock.json(取決於npm版本)。再初始化的時候,webpack及版本號默認添加在
dependencies
,而不是devDependencies。- 二者都沒有,npm會一直向上尋找package.json或者node_modules文件夾所在目錄,最終終止在用戶根目錄。
- 若是你使用的是 npm 5,你可能還會在目錄中看到一個
package-lock.json
文件(能夠理解爲npm5以上,有包下載到node_modules,就會生成package-lock.json)。- package.json中的
name
屬性不能爲「webpack」- 本地安裝 webpack 後,咱們也並不能在命令行中使用 webpack 命令。由於環境變量中沒有對應的路徑,提示:webpack command is not found.
- 若是不帶參數或者帶--save,會在dependencies這裏。卸載的時候清空dependencies。--save-dev在"devDependencies",卸載清空devDependencies。卸載不用帶參數。
1. 利用package.json設置中的scripts屬性。定義在package.json裏面的腳本,稱爲 npm 腳本
在 npm scripts 中咱們能夠經過包名直接引用本地安裝的 npm 包的二進制版本,而無需編寫包的整個路徑。git
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "lwebpack": "webpack" }
在命令行下,$ npm run
,而後回車,就會顯示全部可使用的命令。npm run 是npm run-script的縮略。
start、test、stop和restart這樣的特殊腳本能夠直接執行,npm [xx]
, 其它的腳本任務須要用npm run xx
來執行。
經過向npm run [命令]
和參數之間添加兩組兩個中橫線,能夠將自定義參數傳遞給 npm 腳本,例如:npm run lwebpack -- --v。
npm 腳本原理web
1.每當執行npm run,就會自動新建一個 Shell,在這個 Shell 裏面執行指定的scripts腳本命令。所以,只要是 Shell(通常是 Bash)能夠運行的命令,就能夠寫在 npm 腳本里面。chrome
2.比較特別的是,npm run新建的這個 Shell,執行scripts的時候,會將當前目錄的node_modules/.bin子目錄加入PATH變量,執行結束後,再將PATH變量恢復原樣。shell
3.這意味着,當前目錄的node_modules/.bin子目錄裏面的全部腳本,在scripts中均可以直接用腳本名,而沒必要加上路徑。好比,當前項目的依賴裏面有 Mocha,只要直接寫mocha test就能夠了。npm
"test": "./node_modules/.bin/mocha test" //能夠簡寫爲 "test": "mocha test"因爲 npm 腳本的惟一要求就是能夠在 Shell 執行,所以它不必定是 Node 腳本,任何可執行文件均可以寫在裏面。
2. 自定義shell命令來操做
$ alias lwebpack="node_modules/.bin/webpack" 或, $ alias lwebpack =PATH=$(npm bin):$PATH
3. 能夠運行在初始安裝的 webpack 包中的 webpack 二進制文件(./node_modules/.bin/webpack)。直接在cli裏運行:
$ node_modules/.bin/webpack -v $ node_modules/webpack/bin/webpack.js -v
本地安裝 webpack 後,node_modules中會生成一個.bin文件夾,能夠發現裏面有webpack相關的幾個文件。這裏的 webpack 是 node_modules/webpack/bin 這個包裏面 webpack.js可執行文件 的軟連接 。直接在.bin 目錄下使用./webpack -v
,或者在bin目錄下使用./webpack.js -v
,須要加[ . /
], 外層則可加,可不加。
注意
:當在 windows 中經過調用路徑去調用 webpack 時,必須使用反斜線\
4. $ node ./node_modules/.bin/webpack -v
同理,執行 webpack 的可執行 js ,這樣執行的好處是能夠加一些 js 的標記變量 flag ,例如調大 old memory size 或者進行 chrome debug (暫時還沒懂什麼意思,不過這也是一種應用方法)
5. 還能夠:
$ `npm bin`/webpack -v
6. npm 5.2.0以上,會安裝一個新的包npx。npx是一個npm包執行器,旨在提升從npm註冊表使用軟件包的體驗。
$ npx webpack -v
7. 新建一個index.js,內容以下:
const webpack = require('webpack'); webpack();
而後在cli裏運行$ node index.js
便可
8. 利用package.json的bin屬性和npm link
網上查的時候有人提到了bin這個屬性,這裏,花了一些時間,終於好像
弄清楚了。
package.json中bin:
不少包都有一個或多個可執行模塊,但願用戶安裝包的同時,把這些可執行模塊配置到PATH中,npm讓這個工做變得十分簡單(實際上npm自己也是經過bin屬性安裝爲一個可執行命令的)
bin,是一個命令名和本地文件名的映射。在npm安裝某個包(模塊)時,會查找這個包中package.json文件是否包含bin屬性,若是有,會爲bin中配置的可執行文件建立一個軟連接,名字是bin中的key值,安裝方式不一樣,連接位置不一樣。若是是全局安裝,連接會放到prefix/bin(對於windows系統,默認會在C:UsersusernameAppDataRoamingnpm目錄下,OS X系統中在usr/local/bin,連接到usr/local/lib/node_modules/包下的對應文件),這使你能夠直接在命令行執行key對應命令。若是是本地(局部)安裝,則會在項目內的./node_modules/.bin/目錄下建立一個軟連接,指向node_modules/包下對應可執行文件。
若是你只有一個可執行文件,那麼它的名字應該和包名相同,此時只須要提供這個文件路徑(字符串),如:"bin": "./path/to/program"
。
(實驗:在demo中package.json中添加bin,執行npm install,不行,什麼軟連接都沒有;內容都刪除只留下package.json而後npm intall,也不行。若是想實驗這個功能,能夠實驗性的安裝本身本地的包,使用相對路徑。如npm install ../project
)
npm link , create a global symbolic link to the current folder.
若是package.json中沒有bin,單獨使用npm link:只在/usr/local/lib/node_modules/下生成了一個連接指向項目目錄,連接的名字package.json中的name.
結合bin使用npm link:在/usr/local/lib/node_modules中新生成了一個軟連接,(名字是package.json的name?仍是項目名?經實驗是name)指向項目文件夾。而且,在/usr/local/bin中新生成了一個軟連接(bin中的key),指向/usr/local/lib/node_modules/(name)/下bin指定的文件。
(兩個不一樣版本webpack項目中,設置link同一個名字,(若是link4.0版本,哪裏都4.0,若是link3.0,則有4.0的4.0,其餘3.0. 設置的覆蓋先設置的)
$ npm install webpack@version
若是你熱衷於使用最新版本的 webpack,你可使用如下命令,直接從 webpack 的倉庫中安裝:
$ npm install webpack@beta $ npm install webpack/webpack#<tagname/branchname>
安裝這些最新體驗版本時要當心!它們可能仍然包含 bug,所以不該該用於生產環境。
$ npm uninstall webpack -g ,//沒試 $ npm uninstall webpack