nodejs套件管理工具

18 March 2021

套件管理工具

npm yarn基本上都是負責下載, 執行, 更新, config套件的工具, 基本上yarn跟npm做的事情一樣, 然後survey一些文章後看起來yarn是比npm好很多的

nodejs一個很大的特性就是會透過package.json來定義這個app的行為, 包括怎麼執行, 怎麼刪除, 用了哪些套件. 而套件部分更是常常為了一個套件要載數十道數百個dependencies. 一來會有效率問題, 二來也會有安全上的疑慮(因為dependencies很難知道他安不安全), 三來版本也是一個問題.

npm

就是常用的nodejs package管理套件, 基本上可以跑npm install 下載package.json裡面所紀錄的套件, 可以在package.json定義不同的指令下要執行甚麼操作, 例如npm start要怎麼跑app, npm remove要怎麼刪掉東西. 也可以透過npm –save方式把你下載的套件記錄到package.json裡

一個大問題是, npm –save之類的套件下載方式在package.json內是會記錄下載的版本及以上的版本都可以使用. 因此同樣的packge.json放到其他地方再跑, 可能會下載到的是同個套件但較新版本(如果有新release的話), 導致同個package.json在不同時間跑會下載的套件版本不同. 可能會出現一些bug或consistency的問題. 因此npm在新版本introduce package-lock.json, 不只像packge.json紀錄某個版本以上的套件都行, 而是只紀錄下載的套件的specific version, 因此要確定我們兩次裝的套件版本相同, 就要以package-lock.json為主.

npm遇到的問題

  1. 一般來說npm載一個套件package.json會定義要載版本多少以上的package,然後semantic versioning (semver)會去下載對應那個版本的dependencies下來, 所以一個package的update可能會對應到很多dependencies都要跟著一起動
  2. 在CI環境下要測app有沒有問題時因為要在offline環境, 所以npm 安裝套件會失敗
  3. node_modules太肥, 而且就算裝相同的package, dependencies, 會因為安裝的順序不同而產生不同的node_modules, 這也是為何會產生 同樣的package.json有些機器上不work, 有些work

yarn

強化版的npm, 基本上也是下載套件到local端, 比npm快又安全(看以下reference yarn vs npm), 基本上也是去下載npm registry上的東西

  • yarn一次下載多個package, npm基本上一次只下載一個, 速度遠慢於yarn
  • npm允許下載下來的code跑起來, 這樣如果那個lib是malicious的話電腦直接出事. 尤其是考慮到npm載package同時還會載超多的dependencies, 而且這些dependencies也都能執行. 因此在測試時如果是offline環境會沒有辦法裝dependencies跟測試
  • yarn可以透過package.json, yarn.lock下載特定版本的package, 而且重新寫了一套下載套件的演算法. 避免在不同device下因為使用不同的package version或不同的下載順序導致執行出問題

yarn下載套件流程:

  1. Resolution: 先把需要安裝的dependencies套件都先找到
  2. Fetching: yarn去看本的的global cache有沒有已經安裝這個package了, 沒有的話就去fetch tar檔
  3. Linking: yarn去global cache抓這個app需要的套件把他們copy在local端變成node_modules

一些常用的yarn指令

$ yarn add:  相當於npm i --save
$ yarn install: npm i
$ yarn init: npm init

npx (after npm version 5)

在需要某些npm套件來執行js app時, 我們會使用npm install來裝(either裝在local or global端), 問題點是, npm安裝的node_modules都超級肥大,每次都載很多dependencies, 因此我們會多很多麻煩的檔案,或者global部分會很雜很亂. 因此如我只是要單純測試用可以用nxm.

nxm會當下載完並執行app, 執行完會把套件刪掉, 他只安裝局部性需要的檔案坐簡單測試

npx create-nuxt-app my-nuxt-app

Reference