上圖是vue
的package.json
檔案。
除了vue, React, Ember, Preact, D3, Three.js, Moment, etc.
一些很有名的js庫,紛紛使用Rollup
來作為打包工具,所以Rollup
想必有它的優勢。除了rollup
,當然還有一些大家耳熟能詳的打包自動化工具,比如webpack,gulp,grunt,lerna
,這篇我們就來看一下他們的區別,以免書到用時方恨少!也是幫助我們在構建工程的時候使用合適的工具,當然會讓你事半功倍的~
Rollup
Rollup
是下一代 ES6
模組化工具,它最大的亮點是利用 ES6
模組設計,生成更簡潔、更簡單的程式碼。rollup更適合構建javascript庫。
rollup優勢
- 自動 Tree-shaking(Tree-shaking, 也被稱為 "live code inclusion," 它是清除實際上並沒有在給定專案中使用的程式碼的過程,但是它可以更加高效。)
- 打包速度快
- 配置簡單
rollup使用
npm install rollup
使用配置檔案rollup.config.js
export default {
input: 'src/main.js',
output: {
file: 'bundle.js',
format: 'cjs'
}
};
複製程式碼
執行rollup -c rollup.config.js
簡介:
input:這個包的入口點 (例如:你的 main.js 或者 app.js 或者 index.js)
file: 要寫入的檔案。也可用於生成 sourcemaps,如果適用
format:關於format選項,rollup提供了五種選項:
* amd – 非同步模組定義,用於像RequireJS這樣的模組載入器
* cjs – CommonJS,適用於 Node 和 Browserify/Webpack
* es – 將軟體包儲存為ES模組檔案
* iife – 一個自動執行的功能,適合作為<script>標籤。(如果要為應用程式建立一個捆綁包,您可能想要使用它,因為它會使檔案大小變小。)
* umd – 通用模組定義,以amd,cjs 和 iife 為一體
複製程式碼
瞭解更多模組相關內容,移步我的第一篇文章讀vue原始碼看前端百態1--模組化
rollup基礎外掛
rollup-plugin-alias: 提供modules名稱的 alias 和 reslove 功能
rollup-plugin-babel: 提供babel能力
rollup-plugin-eslint: 提供eslint能力
rollup-plugin-node-resolve: 解析 node_modules 中的模組
rollup-plugin-commonjs: 轉換 CJS -> ESM, 通常配合上面一個外掛使用
rollup-plugin-serve: 類比 webpack-dev-server, 提供靜態伺服器能力
rollup-plugin-filesize: 顯示 bundle 檔案大小
rollup-plugin-uglify: 壓縮 bundle 檔案
rollup-plugin-replace: 類比 Webpack 的 DefinePlugin , 可在原始碼中通過process.env.NODE_ENV 用於構建區分 Development 與 Production 環境.
複製程式碼
學習更多rollup工具:www.rollupjs.com/guide/zh
Webpack
Webpack
的定位是模組打包器,rollup
還不支援一些特定的高階功能,尤其是用在構建一些應用程式的時候,特別是程式碼拆分和執行時態的動態匯入dynamic imports at runtime
.如果你的專案中需要這些功能,則使用webpack更為適合。
segmentfault.com/img/bVVVqL?…
webpack優勢
webpack
是以commonJS
的形式來書寫指令碼滴,但對AMD/CMD
的支援也很全面,方便舊專案進行程式碼遷移- 所有靜態資源都可以被當成模組引用,而不僅僅是
JS
了 - 開發便捷,能替代部分
grunt/gulp
的工作,比如打包、壓縮混淆、圖片轉base64
等 - 擴充套件性強,外掛機制完善(非同步載入、單獨打包)
webpack使用
因為webpack功能非常強大,瞭解更多:webpack.docschina.org/concepts 如果想自己構建一個webpack專案,可以跟隨 segmentfault.com/a/119000001… 學習!這裡就不介紹了
webpack的配置檔案
配置檔案(webpack.config.js),每個專案下都必須配置有一個 webpack.config.js
entry 頁面入口檔案配置,它將是整個依賴關係的根
output 對應輸出項配置(即入口檔案最終要生成什麼名字的檔案、存放到哪裡)
loaders
1、實現對不同格式的檔案的處理,比如說將scss轉換為css,或者typescript轉化為js
2、轉換這些檔案,從而使其能夠被新增到依賴圖中
loader是webpack最重要的部分之一,通過使用不同的Loader,我們能夠呼叫外部的指令碼或者工具,實現對不同格式檔案的處理,loader需要在webpack.config.js裡邊單獨用module進行配置
plugins 外掛項,loaders負責的是處理原始檔的如css、jsx,一次處理一個檔案。而plugins並不是直接操作單個檔案,它直接對整個構建過程起作用
Alias 專案遷移更方便
externals 使用場景是外部依賴不需要打包進bundle
複製程式碼
lerna
一種管理多packages javascript專案的方式。
- 自動解決packages之間的依賴關係
- 通過git 檢測檔案改動,自動釋出
- 根據git 提交記錄,自動生成CHANGELOG
lerna使用
1. npm install lerna -g
2. 初始化一個lerna工程: mkdir lerna
cd lerna/
lerna init
會出現:
- packages(目錄)
- lerna.json(配置檔案)
- package.json(工程描述檔案)
3. 新增測試package包
cd packages/
mkdir modulea
cd modulea/
npm init -y
檔案目錄:
--packages
--modulea
package.json
--lerna.json
--package.json
4. 為modulea中的package.json新增依賴:
{
"name": "modulea",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"vue": "^2.6.6"
}
}
5. 返回主目錄:
執行lerna bootstrap,會發現modulea中的vue依賴已經安裝上了
6.與git倉庫連線(以github為例)
github新建倉庫(根據github的教程)
本地連線遠端 (git remote add origin https://github.com/Wendydesigner/lerna.git)
提交程式碼
git add .
git commit -m "first commit"
git rebase origin/master
git push origin master
7.在lerna.json中新增publish命令
{
"packages": [
"packages/*"
],
"version": "0.0.0",
"command": {
"publish": {
"message": "chore(release): publish %v"
}
}
}
8. 釋出包
lerna publish 在提示中可以選擇版本
可以發現lerna.json與modulea的package.json中的version保持一致;
並且工程中會記錄每次釋出的tag;
9.更新程式碼並提交遠端,可以繼續進行lerna publish
複製程式碼
這是最簡單的lerna的工作流了。但是lerna還有更多的功能等待你去發掘。 lerna有兩種工作模式,Independent mode和Fixed/Locked mode, lerna的預設模式是Fixed/Locked mode,在這種模式下,實際上lerna是把工程當作一個整體來對待。每次釋出packges,都是全量釋出,無論是否修改。但是在Independent mode下,lerna會配合Git,檢查檔案變動,只發布有改動的packge。
lerna最佳實踐
為了能夠使lerna發揮最大的作用,下面是一些特性。
- 採用Independent模式
- 根據Git提交資訊,自動生成changelog
- eslint規則檢查
- prettier自動格式化程式碼
- 提交程式碼,程式碼檢查hook
- 遵循semver版本規範
在開發這種工程的過程的,最為重要的一點就是規範。
gulp
Gulp 是基於“流”的自動化構建工具,採用程式碼優於配置的策略,更易於學習和使用。Webpack 的定位是模組打包器,而 Gulp/Grunt 屬於構建工具。Webpack 可以代替 Gulp/Grunt 的一些功能,但不是一個職能的工具,可以配合使用
grunt
Grunt 是一套前端自動化工具,幫助處理反覆重複的任務。一般用於:編譯,壓縮,合併檔案,簡單語法檢查等
因為webpack以及其外掛實現了Gulp/Grunt的很多基本功能,所以大多數工程也就更傾向於使用webpack了,而Gulp/Grunt被打入了冷宮。
綜上所述,每種提及的工具都有它的最佳實現,找到最合適的,便是最好的~