webpack 版本:4.8.3
1. extract-text-webpack-plugin (CSS獨立分離)
報錯資訊:
Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
at Chunk.get (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/lib/Chunk.js:712:9)
at /Users/chenziyun/Desktop/spa/node_modules/extract-text-webpack-plugin/dist/index.js:176:48
at Array.forEach (<anonymous>)
at /Users/chenziyun/Desktop/spa/node_modules/extract-text-webpack-plugin/dist/index.js:171:18
at AsyncSeriesHook.eval [as callAsync] (eval at create (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:24:12), <anonymous>:7:1)
at AsyncSeriesHook.lazyCompileHook [as _callAsync] (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/node_modules/tapable/lib/Hook.js:35:21)
at Compilation.seal (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/lib/Compilation.js:890:27)
at hooks.make.callAsync.err (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/lib/Compiler.js:481:17)
at _err0 (eval at create (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:24:12), <anonymous>:11:1)
at _addModuleChain (/Users/chenziyun/.nvm/versions/node/v10.0.0/lib/node_modules/webpack/lib/Compilation.js:758:12)
複製程式碼
- 問題:extract-text-webpack-plugin報錯 // 獨立分離CSS
- 原因:沒有webpack 4 版本的 extract-text-webpack-plugin
- 解決辦法:npm install -D extract-text-webpack-plugin@next 替代
2. postcss-loader 自動加字首
webpack.config.js
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: [
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader' //自動加字首
]
})
},
複製程式碼
建立postcss.config.js (放在專案的根目錄下)
module.exports = {
plugins: [
require('autoprefixer') //自動新增字首外掛
]
}
複製程式碼
發現css中並沒有自動加字首,這是需要在package.json中配置
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
複製程式碼
引數:
- last 2 versions: // 每個瀏覽器中最新的兩個版本。
- 1% // 全球瀏覽器使用率大於1%。
- IE9以上
- 其他引數請參考 https://github.com/browserslist/browserslist
3. purifycss-webpack (消除未使用的CSS)
- webpack 4中 使用purifycss-webpack
- 可以查詢:purifycss-webpac
npm install purifycss-webpack purify-css --save-dev
- webpack.config.js 配置 引入模組:
const glob = require('glob');
const PurifyCSSPlugin = require("purifycss-webpack");
複製程式碼
plugin配置:
new PurifyCSSPlugin({
paths: glob.sync(path.join(__dirname, 'src/*.html'))
})
複製程式碼
- 問題:沒有任何報錯,但是打包時,丟失,部分CSS並沒有合併進來,背景圖片也是沒有被打包。
- 原因:分離CSS外掛在去除未使用CSS外掛之前,或者是檔案路徑問題。
- 解決辦法:
- new ExtractTextPlugin 放在new PurifyCSSPlugin之前。
- 檢查下'../src/*.html'路徑是否有問題。。
這裡我是因為webpack.config.js在config目錄下,並非預設在專案根目錄下,所以這裡的__dirname 在config 具體如下:
paths: glob.sync(path.join(__dirname, '../src/*.html'))
複製程式碼
new ExtractTextPlugin("css/index.css"),
new PurifyCSSPlugin({
paths: glob.sync(path.join(__dirname, '../src/*.html')),
}),
複製程式碼
4.對於babel-polyfill 和 transform-runtime
目的:可以使用新的內建物件比如 Promise 或者 WeakMap, 靜態方法比如 Array.from 或者 Object.assign, 例項方法比如 Array.prototype.includes 和生成器函式(提供給你使用 regenerator 外掛)。
第一種方式 全域性引入,完全交由babel-polyfill外掛處理轉義:
npm install --save babel-polyfill
複製程式碼
main.js
import "babel-polyfill";
require("babel-polyfill")
複製程式碼
webpack.config.js
module.exports = {
entry: ["babel-polyfill", "./app/js"]
};
複製程式碼
優點
- 作用域是模組,避免全域性衝突
- 是按需引入,避免不必要引入造成及程式碼臃腫 缺點
- 每個模組內單獨引用和定義polyfill函式,造成了重複定義,使程式碼產生冗餘
第二種方式,區域性引入在使用第三方庫時候,比如ElementUI,iview。建議使用這種方式。
npm install --save-dev babel-plugin-tranform-runtime babel-runtime
複製程式碼
.babelrc檔案中配置外掛:
"plugins": ["transform-runtime"]
複製程式碼
- 優點
- 無全域性汙染
- 依賴統一按需引入(polyfill是各個模組共享的), 無重複引入, 無多餘引入
-
- 適合用來編寫lib(第三方庫)型別的程式碼
- 缺點
- 被polyfill的物件是臨時構造並被import/require的,並不是真正掛載到全域性由於不是全域性生效,對於例項化物件的方法,如[].includes(x),依賴於Array.prototype.includes仍無法使用
5.package.json中scripts
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --config=build/webpack.dev.config.js --inline --open --hot",
"build": "cross-env NODE_ENV=prod webpack --config=build/webpack.prod.config.js"
},
複製程式碼
npm install cross-env --save-dev
複製程式碼
設定變數時,不要使用&&否則,會被認為執行兩條命令,這時重新開始webpack沒有cross-env的webpack,通過process.env.NODE_ENV拿到了undefined