做爲一個前端開發者,用了這麼久的npm,有一天忽然問本身。本身究竟對npm
有多瞭解?html
想一想咱們最先寫js的時候,對於重複引用的代碼片斷,咱們是怎麼引用的?前端
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
是否是感受熟悉又陌生。這就是最先咱們引用js的方式。後來因爲nodejs出現了,做爲一種能夠運行在系統上的語言,沒有了html,咱們該怎麼引用js呢?node
module.exports=function(x){console.log(x);}; var xxx = require('xxx');
所以出現了CommonJS規範。固然此外,咱們還有AMD,CMD等。那麼這些規範的出現使得咱們能夠更加愉快地引用js代碼。這時候咱們便須要一種方式能夠更方便地提交或者獲取某些代碼。npm所以出現了。他有如下功能:jquery
首先咱們要知道咱們的項目中須要用到什麼依賴,版本是什麼?這些信息須要找一個地方記錄,這就是package.json
。npm
npm init
npm能夠經過命令建立模塊,生成 package.json 文件,生成的文件包含了基本的結果。當咱們須要從網上下載依賴的時候只要執行json
npm ininstall xxx
npm就會把依賴下載放到node_modules
文件夾中,並在package.json
中記錄咱們下載的依賴的名稱和版本號。服務器
當咱們引用js的時候,系統該去哪裏找咱們須要的代碼?npm做了一個規範,就是node_modules
。系統會先當前目錄找有沒有適合的代碼,若是找不到就往上一層文件夾找,找到node_modules
以後就會在node_modules
裏找。找到代碼,便引用成功。若是找不到就在全局裏面找,還找不到就會拋出錯誤。工具
上面剛剛說到的,npm引用的時候是一層一層的往外找的,這是爲何呢?由於咱們在開發的時候引用的某些依賴自己,並非徹底由該做者全程寫完的。有可能某些依賴中還依賴着另外一個包。因此咱們會看到node_modules
包裏的文件夾裏還有一個package.json
,而他的依賴則放在當前的文件夾裏的node_modules
中。ui
├─node_modules └─xxx └─node_modules
這樣就會產生一個問題,萬一引用的依賴又套另外一層依賴,這樣由很是多層依賴組層。最後引用的路徑就會很長,有可能會遇到不可估算的錯誤。另外這樣也會致使同一個包會被下載屢次的問題。爲了解決這個問題,從npm 5(這就是爲何會有yarn 的緣由) 以後package-lock.json
出現了。他的做用是記錄這項目中用到的依賴包的具體版本號,和位置信息。在每次install
的時候他會先檢查node_modules
的首層有沒有該依賴須要的包,若是有了就不下載。若是有同名的包,但是版本號需求不一樣,就會在該package.json
的路徑下再建立node_modules
把那個須要的包放進去。這樣因爲引用的時候是一層一層外網找的,就能夠確保當前依賴引用的是正確的包。也大大減小了套層的狀況。命令行
咱們都知道當咱們執行npm install
的時候,會下載咱們想要的代碼。但是他是從哪裏下載回來的呢?npm有本身的一個代碼庫,也就是咱們經常使用的https://www.npmjs.com。但是這裏有個問題,這個地址的國外的服務器,會致使咱們常常出現下載很慢的結果。這就出現了不少咱們說的「源」。所謂的「源」就是不一樣的代碼倉庫,國內目前用的最多的應該就是阿里的源,想要改變下載代碼的倉庫只要執行。
npm install xxx --registry=https://registry.npm.taobao.org
這樣咱們就能夠改爲從阿里的服務器上下載資源。若是想要全局替換這個源,能夠執行
npm config set registry https://registry.npm.taobao.org
這時候可能又聰明的同窗要問了,能不能在不改全局配置的狀況下給項目規定一個特定的源?其實在npm的安裝目錄下有一個.npmrc
文件,他記錄着npm的源地址,咱們經過上面的命令事實上就是在修改他。若是咱們想要在項目中配置特定的源,只要在項目目錄下新建一個.npmrc
文件,編輯內容:
registry=https://registry.npm.taobao.org
這樣只要咱們在這個項目下執行npm install
都會指向咱們規定的地址了。
待補充...