本文代碼地址在githubcss
前言:之前剛接觸webpack的時候仍是1,當時大概過了下文檔操做了一下當時寫的一些註釋。後來開發的時候基本寫react都是用的create-react-app或者找別人的搭好的腳手架用。因此趁着這段時間的間隙加上webpack4剛出也不算久,從新學習加複習下webpack的一些知識。html
幾個小tips:前端
該配置目前進度:基本可用開發小型多頁面。詳細可見github,歡迎大佬們提供issue或施捨個star2333node
使用react
yarn
yarn dev // 開發模式 8000端口
yarn build // 構建
複製代碼
babel的強大性很少說了。咱們寫前端最重要的就是裝x。使用各類高大上的ES6789語法來寫js,可是瀏覽器不兼容就須要babel來進行轉碼了。webpack
yarn add babel-plugin-transform-runtime --dev
和yarn add babel-runtime --save
。再.babelrc中配置。參考引入normalize.css消除瀏覽器差別git
通常都是使用extract-text-webpack-plugin來實現css樣式抽離,可是抽離的樣式是不支持熱更新的,webpack默認只支持內聯樣式的熱更新。在webpack4的文檔中,官方也推薦咱們使用mini-css-extract-plugin代替extract-text-webpack-plugin,而且該plugin配合css-hot-loader能夠實現樣式抽離和熱刷新的。因此咱們項目採用了用mini-css-extract-plugin+css-hot-loader的方式。github
{
test: /\.css$/,
use: [
'css-hot-loader', //支持熱更新
MiniCssExtractPlugin.loader,
"css-loader"
]
}
複製代碼
postcss 是一個css後處理工具,能讓咱們提早使用下一代css語法,幫咱們根據配置的目標瀏覽器編譯出瀏覽器能用的css代碼 todoweb
寫react比較經常使用的 todo瀏覽器
todo
這樣就不須要手動去設置entry和Pugin中手動生成html了 咱們約定了目錄結構以下
咱們要作的操做就是
一、掃描src目錄下,取得index other other...這些目錄名,而後把目錄名做爲輸入的HtmlWebpackPlugin生成html的文件名,而且引用對應的js
二、設置入口的entry參數
function buildEntriesAndHTML() {
// 用來構建entery
const result = glob.sync("src/**/*.js");
const config = {
hash: true,
inject: true
}
const entries = {};
const htmls = [];
result.forEach(item => {
const one = path.parse(item);
entries[one.dir.split("/").slice(-1)[0]] = "./" + item;
htmls.push(new HtmlWebpackPlugin({
...config,
template: "./" + one.dir + "/index.html",
chunks: [item]
}));
})
return {
entries,
htmls
}
}
複製代碼
jq多頁面應用確定是要在頁面裏面寫一堆html的,默認狀況下webpack server html是不會熱更新,html-webpack-plugin是不會觸發HMR的。 經過raw-loader插件,開發模式下在每一個頁面的入口把頁面的htmlrequire進去便可,這樣就能實現熱刷新了23333
if (process.env.NODE_ENV === "development") {
require("./index.html");
}
複製代碼
這樣每一個文件引入彷佛很傻。應該讓工具自動化操做,應該要寫個loader在指定文件開頭注入上面那段代碼,而後再給babel處理。根目錄下本身寫了個inject-loader。loader的原理其實就是接受上次的處理結果,把返回值傳給下個loader使用。咱們在js文件babel處理前使用該loader便可
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: [{
loader: 'babel-loader',
options: {
cacheDirectory: true // 使用緩存
}
}, {
loader: path.resolve("./inject-loader.js") // 開發模式使用注入代碼實現html熱更新
}]
}
//inject-loader.js
const path = require("path");
module.exports = function(source) {
if (path.basename(this.resourcePath) === "index.js") {
// 咱們約定好只有index.js纔會注入注入加載代碼
return `if (process.env.NODE_ENV === "development") {
require("./index.html");
};` + source;
}
return source
}
複製代碼
這樣一個簡單的loader就完成了2333,實現了自動化注入html熱刷新代碼
webpack -config ./webpack.xxx.js
複製代碼
webpack.base.config.js 公用配置 webpack.dev.config.js 開發環境配置 webpack.prod.config.js 生產環境配置
本人水平有限,有不足敬請大佬指出。 只做爲一個學習項目。一些緩存優化和分包加載方面的內容還沒有考慮。todo