下一代零配置打包工具 Parcel 初體驗
過於複雜繁瑣的 webpack 配置一直是前端項目里的一個痛點,而新一代的「零配置」打包器 parcel 正在解決這個問題,春節回來之後的這幾天我嘗試把手上的業務遷移到 parcel 構建,下面就是一些踩坑心得。
先說結論:
- parcel 極其適合小型單頁 React 頁面的打包構建,真的是完全零配置
- 對於 vue,目前 parcel-plugin-vue 存在一些坑(詳細請看這個 issue),現在已經修復,但 parcel-plugin-vue 還未更新。
- 對於大型多頁的項目,parcel 打包構建沒有問題,但目前 parcel 1.6.2版本還不支持 CommonsChunk 和 Tree Shaking,對於 alias 的支持在下個版本才會加入,所以構建出來的 js 體積還比較大。
快速上手
先從一個極簡的 React 應用開始,首先當然是先安裝:
npm i parcel-bundler -g
然後你可以隨便寫一個 React 的 Hello World:
<!-- index.html --><html><body> <div id="root"></div> <script src="./index.js"></script></body></html>
// index.jsimport React from react;import ReactDOM from react-dom;ReactDOM.render( <h1>Hello, parcel!</h1>, document.getElementById(root));
我們這裡用到了 ES6 語法,以及 JSX,但與 webpack 不同的是,我們不需要額外地配置一堆 loader 和插件,不需要區分開發/生產環境的構建配置。
為了這段 ES6/JSX 的代碼能跑起來,只需要安裝一些 babel 插件就可以了:
npm install babel-preset-envnpm install babel-preset-react
然後寫一個 .babelrc
:
{ "presets": ["env", "react"]}
然後,就可以跑起一個自帶 HMR,支持 ES6/JSX 語法等等高階特性的本地開發環境:
parcel index.html
對於常見的圖片、less文件什麼的,parcel 當然是天生支持的,無需任何配置:
// 來一張圖片import yourImage from 123.png;// 來一個 less 文件import index.less;ReactDOM.render( <img src={yourImage} />, document.getElementById(root));
構建也很簡單:
parcel build index.html
使用 Parcel 構建 Vue 項目
與 React 稍有不同的是,我們要額外安裝一個 parcel-plugin-vue
來支持對於 .vue
文件的載入:
npm i parcel-plugin-vue
然後就非常簡單了:
<!-- index.html --><html><body> <div id="root"></div> <script src="./index.js"></script></body></html>
// index.jsimport Vue from vueimport App from ./index.vuenew Vue({ el: #root, render: h => h(App)})
<!-- index.vue --><style lang="less" scoped> div { font-size: 50px; text-align: center; }</style><template> <div>hello {{text}}!</div></template><script> export default { data() { return { text: parcel } } }</script>
跑起來:
parcel index.html
我們這裡使用了 .vue
文件,裡面包含了 less 方言、es6 語法,而這些都不需要額外的配置。
vue 項目的一些坑
1、報錯 Uncaught TypeError: Cannot read property add of undefined
我們上面的例子使用的是 parcel 1.6.2 以及 parcel-plugin-vue 1.5.0,有可能會遇到這個錯誤,這個錯誤本質上是 parcel-plugin-vue 中錯誤地重寫了 parcel 的一處方法導致的,現在已經得到修復(詳情請看這個issue),不過目前 parcel-plugin-vue 還沒發布修復後的新版本,可能要再等幾天。
2、報錯 Unknown Version 6.2 of samsung
在一些舊項目中可能會遇到,這是由於本地 browserlist
依賴的 caniuse-lite
版本太舊導致的,更新 caniuse-lite
可以解決:
npm i caniuse-lite
生產環境中使用 parcel 的正確姿勢
1、本地開發環境
parcel 打開開發環境其實很簡單:
parcel xxx.html
但在大多數項目中,我們更偏向於使用項目內安裝的 parcel,而不是全局安裝的 parcel,所以我們會寫一個 npm script,然後 npm run dev
:
{ "scripts": { "dev": "parcel xxx.html" }}
但項目內有可能會存在多個頁面,為每個頁面都寫一個 npm scripts 會很麻煩,所以我們可以配合 npm scripts 的參數來解決:
{ "scripts": { "dev": "parcel" // 這裡不寫頁面名 }}
然後
npm run dev -- /path/to/xxx.html
注意 --
和路徑之間有一個空格,這樣 npm 就會把路徑識別為 parcel 的參數。
2、多頁面項目的構建
parcel 目前還不支持多入口,所以只能一頁一頁地構建,我們可以通過 shell 腳本來自動解決。
例如,我們的項目結構是這樣的:
src└── page ├── page1 ├── index.html └── index.js ├── page2 ├── index.html └── index.js ├── page3 ├── index.html └── index.js └── page4 ├── index.html └── index.js
那麼我們可以寫一個 build.sh
作為構建腳本:
# 先清空 distrm -rf distmkdir dist# 對 page 文件夾下的每一個 name 都進行構建cd ./src/pagefor name in $(ls)do echo building $name ... npm run parcel:build -- src/page/$name/index.html -d dist/$name --detailed-reportdone
注意我們這裡使用了 parcel:build
這個命令:
{ "scripts": { "parcel:build": "parcel build" }}
使用 parcel 構建的優劣總結
優點:
- 零配置真的爽,爽啊爽啊就是爽,用了就回不來了,完全告別幾百行複雜的 webpack 配置。
- 構建速度比 webpack 快很多,內置了大量 webpack 配起來十分蛋疼的東西(比如 HMR、dev server、各種 loader)。
- 完全可以應對大型項目的開發及構建。
缺點:
- webpack 的一些高階特性還不支持,比如 CommonsChunk、Tree Shaking、多入口文件、自定義構建出的文件名、內聯小尺寸的圖片、內聯css等,所以構建出來的資源體積都比較大。
- 目前對於大型項目的構建還需要額外寫 shell 腳本(但我真的覺得比寫 webpack 構建簡單太多了)。
- 還處在快速迭代期,特殊情況下可能會有奇怪的報錯,需要自行 debug 解決。
推薦閱讀:
※iView 發布 1.0 正式版,43 個 UI 組件助力中後台業務開發
※webpack 4.0.0-alpha.3 新功能:JSON Tree Shaking
※web front end Automation Tools
※webpack之loader和plugin簡介