npm進階用法——如何擁有自己的包和流程自動化 如何發佈自己的npm包 如何利用npm實現自動化流程 總結 參考資料

作爲包管理器,npm在前端開發過程中使用頻率很高,不過大部分前端可能只使用過npm install等簡單的功能。今天這篇文章主要介紹一些進階的知識點,分爲兩個部分,第一個部分是從npm包開發者的角度講解怎麼發佈和管理自己的包。而第二部分是從使用者的角度,介紹怎麼使用npm工具進行流程自動化,從而讓前端開發過程更流暢和高效。希望對大家有幫助。

如何發佈自己的npm包

我們可以將開發者大致分爲兩類,一類是使用輪子的,而另一類就是造輪子的。有時候開發業務的前端也需要自己造輪子,那麼就需要能夠發佈和管理自己的前端工具包。

要發佈自己的npm包的話,首先要到npm官網註冊一個賬號。如果你使用的是企業私有的倉庫,那可能就需要到管理員那裏申請一個賬號。

有了這個賬號後,使用npm login命令進行登錄:

現在準備我們要上傳的代碼,先新建一個用於開發npm包的項目:

mkdir npm-test
cd npm-test
npm init

接着就是寫代碼,並準備好一個良好的說明文件(README.md)。

做完準備工作後,就可以執行命令進行發佈了:

npm publish

後續要更新只要在package.json裏修改對應的版本號,然後再執行npm publish命令就可以了。

關於版本號和標籤

npm包的版本號遵循着一定的規範,比如1.5.2這個版本號,其中1是主版本號(major version),5是次版本號(minor version),而 2是補丁版本號(patch version),主要用來bug修復的更新等。在包管理的時候遵循對應語義的版本號更新,便於後續維護。

同時,在發佈一個新版本的時候,還可以使用打標籤的方式進行標記,如:

npm publish --tag beta
npm publish --tag bugfix

如果你的包是已經發布過了,還可以對指定的版本號進行打標籤:

npm dist-tag add [email protected] [stable]

scope包

有時候你需要同時發佈多個包,而且這些包之間有着從屬關係。這時候,你可以考慮將它們放在同一個域(scope)下面進行管理。就像我們平常使用@material包一樣,所有的scope包都會有一個域名,在初始化包的使用以下命令:

npm init --scope=@scq000test

這樣我們就創建了從屬於這個域的包了。默認情況下,這樣發佈的包是私有的,如果要發佈到公網上,必須指定對應的權限,可以執行如下命令進行發佈:

npm publish --access public

這樣一來,在後續使用過程中只要執行npm install @scq000test就會批量安裝所有以@scq000test作爲域的包了。

安全審查

一般在寫完代碼之後,都有必要進行安全檢測,以確保代碼中引用的其它npm包都是符合安全規範的。要做到這一點可以利用官方提供的npm audit命令進行處理。

當我們執行npm install來安裝依賴包的時候,默認情況npm也會執行安全審查的操作。但是如果我們想要更詳細的審查信息就需要執行命令npm audit進行查看。

如果發現安全報告中有可疑項,可以使用命令:

npm audit fix

進行自動修復。修復完成後,如果還有問題,就需要仔細分析引用包的風險,再考慮手動修復或者換包。

npm緩存

利用緩存是提高安裝速度的一種很有效的方式。不過有時候npm緩存也很容易造成一些麻煩,如果你在項目使用過程當中一旦懷疑是緩存影響了代碼的正常工作,可以使用npm cache verify這個命令驗證緩存信息。

另外,還可以使用命令npm cache clean用來清理緩存,當代碼有問題的時候,這個命令也十分常用。

如何利用npm實現自動化流程

提高開發效率在平常的工作中是十分重要的,因爲對於能夠自動化執行的操作耗費精力是不值得的。那麼在前端開發過程當中有哪些小技巧能夠有效地幫助我們提高日常工作效率呢?

這裏推薦使用npm腳本

前端工作流當中很重要的一個部分就是使用自動化腳本進行構建,想必大家平常使用最多的其實是npm start這個命令。其實除了這個比較常用的命令之外,我們還能夠做一些更深入的挖掘。如果你能夠把一個常用的任務拆分成許多子任務的話,那麼在後期維護和管理的過程當中就能更有效率。

比如,在做前端項目的測試的時候,通常可以將任務分爲單元測試,端對端測試和集成測試。藉助npm run all這個工具就能夠批量執行測試腳本:

{
  "scripts": {
    "test:unit": "jest unit/*.spec.js",
    "test:e2e": "jest e2e/*.spec.js",
    "test:integrate": "jest integrate/*.spec.js",
    "test": "npm-run-all test:* --parallel"
  }
}

這樣一來,只需要執行npm run test這一條命令,就能同時執行所有的測試任務。

另外一個例子就是我們常常還需要注意不同操作系統上兼容性問題。可能你寫的一些npm腳本並不能夠很好地在多個操作系統上都工作。這時候你就需要花一些時間去調試這些腳本,或者是找到所對應的跨平臺的解決方案,再或者說可以利用工具run-script-os來針對不同的操作系統寫腳本:

{
  "scripts": {
    "test": "run-script-os",
    "test:win32": "echo 'del whatever you want in Windows 32/64'",
    "test:darwin:linux": "echo 'You can combine OS tags and rm all the things!'",
    "test:default": "echo 'This will run on any platform that does not have its own script'"
  }
}

很多Linux環境下的常用命令在node.js端也已經有現成的工具,我們可以很方便地拿來就用。下面是一些在實際開發當中用的比較多的一些npm包以及它們所對應的Linux命令:

linux命令 對應的npm包
bash node
cat catw
rm rimraf
mkdir mkdirp

還有一個注意事項是,在寫腳本過程當中,我們不應該過度地依賴node_module這個目錄,而應該使用一個比較通用的路徑名稱,以便在其他開發者的電腦上也能夠正常的使用我們寫的npm腳本。下面這個例子就不是一個很好的實踐,因爲在他人的電腦上可能失效:

{
  "scripts": {
    "test": "./node_modules/.bin/jest ./index.spec.js"
  }
}

我們最好將其改成下面這樣:

{
  "scripts": {
    "test": "jest ./index.spec.js"
  }
}

生命週期

npm提供了強大的生命週期鉤子,prepost。通過前置和後置鉤子可以讓將環境準備和清理的工作從主任務中拆分出來。

{
    "scripts": {
        "prebuild": "npm install",
        "build": "cross-env NODE_ENV=production webpack",
        "postbuild": "rimraf ./dist"
    }
}

總結

npm已經是前端開發的一個核心工具了,利用好官方提供的一些高級功能能夠極大地提高我們開發的效率。如果你是npm包的開發者,那麼就需要理解整個發佈流程和版本號更新的策略。而作爲使用者,需要掌握npm scripts的編寫,讓開發體驗更加順暢。

——--轉載請註明出處--———


最後,歡迎大家關注我的公衆號,一起學習交流。

參考資料

https://docs.npmjs.com/misc/scripts

http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章