1. 程式人生 > >webpack創建過程詳解

webpack創建過程詳解

pan version 假設 參數 兼容性 向上 每次 第三方庫 官方

npm install 就是安裝模塊,npm run dev 就是執行npm script中的命令。當我們執行npm命令的時候,它到哪裏去找,這就要說到每個node項目中都有的核心文件package.json 文件。

  項目開始時,我們就要建立這個文件。假設我們要創建一個node 項目,我們會新建一個文件夾命名node, 這時我們就要創建package.json文件。進入node 文件夾,你可以手動創建,就和創建一個txt文件一樣,但我們一般都會使用命令創建,打開cmd 窗口,輸入npm init, 這時你要回答幾個問題,如name,version 等,輸入內容,一路回車鍵,當你輸入yes的時候,package.json 創建成功,你的文件夾中多了這個文件。

  其中有幾個字段比較重要:

  name 項目名稱, 你可能在項目中使用過 var express = require(‘express’), require 函數後面的參數,就是package.json 中的name字段,所以這個name一定要簡短,且不能有大寫,這是規定。

  version版本號:安裝一個模塊的時候, 你可能指定過特定的版本號,npm install express @4.13.2, 版本號4.13.2 就是我們這裏的version。版本號有三個組成部分,4:表示的是大版本,一般是重大升級。13:表示的是小版本, 在大版本的基礎進行的小的更新,如某個功能廢棄了,新增了那個功能。2: 對該版本進行補丁,主要是版本bug的修復。

  script: 我們在命令行中執行的所有命令都寫在這個地方,然後用 npm run 去執行這個命令。

  項目初始完成後,我們就可以進行項目開發。在開發過程中我們都會用到一些第三方庫和 框架,尤其是node 開發, 因為它提供的API 有點底層. 如果想用第三方的東西,就要事先安裝。上面說到 安裝用的命令是npm install。 npm install express --save --save 是什麽意思?--save表示,我們安裝模塊的時候,同時把它寫到package.json 文件中。這時打開package.json 文件,我們看到多了一個dependencies字段,它包括了我們剛安裝的express. node中有些es6/es7 的語法不支持,我們使用的時候,就需要進行轉換。這時安裝babel. npm install babel-cli babel-preset-es2015 --save–dev --save-dev 又是什麽,它也表示安裝依模塊的時候,把它寫到package.json中,不過它寫入的不是dependencies, 而是devDependencies中。

無論devDependencies還是dependencies中,安裝的模塊版本號前面還有符號^, 其實這裏還有很多符號也可以無符號,符號主要是限定版本。

  "express": "4.15.2" 版本號前面什麽符號都沒有,它表示固定版本,安裝版本時,只會安裝這個指定的版本。

  "express": "~4.15.2",版本號前面有符號~,它表示安裝4.15.x 的版本,只x>3 就可以。在這裏,我們express指定是4.15.2 版本,當我們npm install 安裝的時候,它可能在項目中安裝4.15.5或者4.15.6 版本。

  "express": "^4.15.2" , 版本號前面有符號^, 它表示可以安裝4.x.x 的版本,只要中間的x 大於15就可以。

  >=4.15.3 版本號前面有符號>=, 它安裝大於我們指定的版本,就可以。

  有時還看到一個*, 表示安裝最新版本。

  版本號一定要註意,因為有些框架和庫在進行版本升級的時候,向後兼容性必較差,容易引起代碼沖突。但npm install 進行安裝的時候,它默認是^ 符號,如果不符合我們要求,我們可以對package.json 進行手動修改,如 把^號改成~, 或直接去掉符號, package.json文件,只是一個文件, 我們可以手動地進行任何修改。

發現我的node項目下有一個package.json和一個package-lock.json文件,順便扒一扒這兩個的區別,其實package-lock就是鎖定安裝時的包版本號,需要上傳到git上,以保證其他人在install時候,大家的依賴版本相同。

官方文檔:這個package-lock.json 是在 `npm install`時候生成一份文件,用以記錄當前狀態下實際安裝的各個npm package的具體來源和版本號.

跟package.json的區別在於(舉個栗子):

"dependencies": {
 "@types/node": "^8.0.33",
},

這裏的^向上尖號是定義向後(新)兼容依賴,如果types/node版本是超過8.0.33,並且是在大版本(8)上相同,就允許下載最新的types/node包。同一個大版本不同版本號之間存在差異,導致依賴庫包行為特征有時候不兼容。

所以npm最新的版本就開始自動生成package-lock.json功能,目的就是確保所有庫包與你上次安裝的完全一樣。

package.json文件只能鎖定大版本,即版本號的第一位,不能鎖定後面的小版本,你每次npm install時候拉取的該大版本下面最新的版本,可能有些童鞋之前就踩過類似的坑。

一般為了穩定性考慮我們不能隨意升級依賴包,因為如果換包導致兼容性bug出現很難排查,所以package-lock.json就是來解決包鎖定不升級問題的。

如果要升級package-lock.json裏面的庫包,怎麽操作呢?

npm install [email protected]

package.json與package-lock.json文件的作用

package.json文件記錄你項目中所需要的所有模塊。當你執行npm install的時候,node會先從package.json文件中讀取所有dependencies信息,然後根據dependencies中的信息與node_modules中的模塊進行對比,沒有的直接下載,已有的檢查更新(最新版本的nodejs不會更新,因為有package-lock.json文件,下面再說)。另外,package.json文件只記錄你通過npm install方式安裝的模塊信息,而這些模塊所依賴的其他子模塊的信息不會記錄。

package-lock.json文件鎖定所有模塊的版本號,包括主模塊和所有依賴子模塊。當你執行npm install的時候,node從package.json文件讀取模塊名稱,從package-lock.json文件中獲取版本號,然後進行下載或者更新。

因此,正因為有了package-lock.json文件鎖定版本號,所以當你執行npm install的時候,node不會自動更新package.json文件中的模塊,必須用npm install packagename(自動更新小版本號)或者npm install [email protected](指定版本號)來進行安裝才會更新,package-lock.json文件中的版本號也會隨著更新。

附:當package.json與package-lock.json都不存在,執行"npm install"時,node會重新生成package-lock.json文件,然後把node_modules中的模塊信息全部記入package-lock.json文件,但不會生成package.json文件,此時,你可以通過"npm init --yes"來生成package.json文件



webpack創建過程詳解