摘要:它允許在運行時更新各種模塊,而無需進行完全刷新。構建生產環境開發環境和生產環境的構建目標差異很大。在開發環境中,我們需要具有強大的具有實時重新加載或熱模塊替換能力的和。
1. 構建開發環境
如果你一直跟隨我前面的博文,那么你對webpack的基礎知識已經有比較深刻的理解了。之前,我們一直執行著:
npm run build
來打包編譯輸出我們的代碼,本文我們來看看如何構建一個開發環境,來使我們的開發變得方便些。
1.1 webpack-dev-serverwebpack-dev-server是一個簡單的小型的web服務器,并且能夠實時重載,配置也很簡單,首先安裝:
npm install --save-dev webpack-dev-server
配置webpack.config.js:
devServer: { port: 8080, // 端口號 host: "0.0.0.0", // 主機名,設為該值可通過IP訪問 overlay: { errors: true // 錯誤提示 } }
在package.json中添加命令:
"dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack.config.js"
執行:
npm run dev
可見我們的服務已經跑起來了:
在webpack打包源碼時,我們會很難找到錯誤的出現位置,比如將源文件 sum.js、minus.js打包到bundle.js中,其中一個源文件出現了錯誤,僅僅會追蹤到bundle.js中,這對我們來說并不理想。因此為了更加便捷的找到錯誤的原始位置,JavaScript為我們提供了 source-map的功能,將編譯后的代碼映射回原始源代碼。如果一個錯誤來自于 sum.js,source map 就會明確的告訴你。
我們來測試一下,在sum.js中輸出一個錯誤:
// ES Mudule 規范 export default function (a, b) { console.error("this is test") // 輸出錯誤 return a + b }
在沒有devtool配置的情況下 npm run dev,會發現錯誤提示的行數并不準確,
原因是我們的代碼是被編譯過的
然后在webpack.config.js中加入配置:
devtool: "inline-source-map", // 加入devtool配置
當配置文件改動時需要重新執行 npm run dev:
錯誤提示行數以及源碼映射都是正確的。devtool的取值有很多,大家可根據需要自行配置
模塊熱替換(Hot Module Replacement)是 webpack 提供的最有用的功能之一。它允許在運行時更新各種模塊,而無需進行完全刷新。
使用非常簡單,在webpack.config.js中引入webpack:
const webpack = require("webpack")
在plugins數組中添加:
new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin()
給devServer中的hot屬性設為true:
devServer: { port: 8080, // 端口號 host: "0.0.0.0", // 主機名,設為該值可通過IP訪問 overlay: { errors: true // 錯誤提示 }, hot: true }
這樣我們修改代碼的時候就可以局部刷新模塊而不是刷新整個頁面了。
2.構建生產環境開發環境(development)和生產環境(production)的構建目標差異很大。在開發環境中,我們需要具有強大的、具有實時重新加載(live reloading)或熱模塊替換(hot module replacement)能力的 source map 和 localhost server。而在生產環境中,我們的目標則轉向于關注更小的 bundle,更輕量的 source map,以及更優化的資源,以改善加載時間。由于要遵循邏輯分離,我們通常建議為每個環境編寫彼此獨立的 webpack 配置。雖然,以上我們將生產環境和開發環境做了略微區分,但是,請注意,我們還是會遵循不重復原則(Don"t repeat yourself - DRY),保留一個“通用”配置。為了將這些配置合并在一起,我們將使用一個名為 webpack-merge 的工具。通過“通用”配置,我們不必在環境特定的配置中重復代碼。
我們先從安裝 webpack-merge 開始,用來合并webpack配置項:
npm install --save-dev webpack-merge
在config文件夾下創建 webpack.dev.js 和 webpack.build.js 并修改 webpack.config.js,將開發與生產環境的公共配置放在webpack.config.js中:
const path = require("path") const HtmlWebpackPlugin = require("html-webpack-plugin") const MiniCssExtractPlugin = require("mini-css-extract-plugin") const isDev = process.env.NODE_ENV === "development" const config = { entry: { main: path.join(__dirname, "../src/main.js") }, output: { filename: "[name].bundle.js", path: path.join(__dirname, "../dist") }, module: { rules: [ { test: /.(vue|js|jsx)$/, loader: "eslint-loader", exclude: /node_modules/, enforce: "pre" }, { test: /.js$/, loader: "babel-loader", exclude: /node_modules/ }, { test: /.vue$/, loader: "vue-loader", options: createVueLoaderOptions(isDev) }, { test: /.ejs$/, use: ["ejs-loader"] }, { test: /.css$/, use: [ isDev ? "vue-style-loader" : MiniCssExtractPlugin.loader, { loader: "css-loader", options: { importLoaders: 1 } }, "postcss-loader" ] }, { test: /.less$/, use: [ isDev ? "vue-style-loader" : MiniCssExtractPlugin.loader, "css-loader", { loader: "postcss-loader", options: { sourceMap: true } }, "less-loader" ] }, { test: /.(jpg|jpeg|png|gif|svg)$/, use: [ { loader: "url-loader", options: { name: "[path][name]-[hash:5].[ext]", limit: 1024 } } ] } ] }, plugins: [ new HtmlWebpackPlugin({ template: path.join(__dirname, "../index.html"), inject: true, minify: { removeComments: true } }) ] } module.exports = config
webpack.dev.js
const merge = require("webpack-merge") const common = require("./webpack.config.js") module.exports = merge(common, { mode: "development", devtool: "inline-source-map", devServer: { port: 8080, host: "0.0.0.0", overlay: { errors: true }, historyApiFallback: { index: "/index.html" } } })
webpack.build.js
const path = require("path") const CleanWebpackPlugin = require("clean-webpack-plugin") const MiniCssExtractPlugin = require("mini-css-extract-plugin") const merge = require("webpack-merge") const common = require("./webpack.config.js") module.exports = merge(common, { mode: "production", optimization: { splitChunks: { chunks: "initial", automaticNameDelimiter: ".", cacheGroups: { commons: { name: "commons", chunks: "initial", minChunks: 2, priority: 3 }, vendors: { test: /[/]node_modules[/]/, priority: 1 } } }, runtimeChunk: { name: entrypoint => `manifest.${entrypoint.name}` } }, plugins: [ new MiniCssExtractPlugin({ filename: "[name].css" }), new CleanWebpackPlugin( ["dist"], { root: path.join(__dirname, "../") } ) ] })
修改package.json的命令:
"dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack.dev.js", "build": "cross-env NODE_ENV=production webpack --config config/webpack.build.js --progress --inline --colors"
現在分別執行 npm run dev 和 npm run build 就會得到你想要的了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101169.html
摘要:傳送門系列教程一初識系列教程二創建項目,打包第一個文件系列教程三自動生成項目中的文件系列教程四處理項目中的資源文件一系列教程五處理項目中的資源文件二系列教程六使用分割代碼系列教程七使用系列教程八使用審查代碼系列教程九開發環境和生產環境 在前端開發日益復雜的今天,我們需要一個工具來幫助我們管理項目資源,打包、編譯、預處理、后處理等等。webpack的出現無疑是前端開發者的福音,我的博文只...
摘要:按照我們的仿真的環境,最終之后的效果應該是打包后的文件不含有樣式類。如果忘記了它的用法,請查看系列教程六處理系列教程五處理所以,我們的文件如下安裝完相關插件后,我們需要在的配置中引用第三部分定義的代碼。 教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 原文地址 有空就來看看個人技術小站, 我一直都在 0. 課程介紹和資料 本次課程的代碼目錄(如下圖所示):s...
摘要:按照我們的仿真的環境,最終之后的效果應該是打包后的文件不含有樣式類。如果忘記了它的用法,請查看系列教程六處理系列教程五處理所以,我們的文件如下安裝完相關插件后,我們需要在的配置中引用第三部分定義的代碼。 教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 原文地址 有空就來看看個人技術小站, 我一直都在 0. 課程介紹和資料 本次課程的代碼目錄(如下圖所示):s...
摘要:全網最貼心系列教程和配套代碼歡迎關注個人技術博客。所以我花費了個多月整理了這份教程,一共分成節,每節都有講解,并且準備了配套代碼。奈何深感水平不夠,只有一腔熱情,所以直接開放了教程和源碼。 webpack-demos:全網最貼心 webpack 系列教程和配套代碼 歡迎關注個人技術博客:godbmw.com。每周 1 篇原創技術分享!開源教程(webpack、設計模式)、面試刷題(偏前...
摘要:教程所示圖片使用的是倉庫圖片,網速過慢的朋友請移步系列教程十二處理第三方庫原文地址。因為正式項目中,由于需要的依賴過多,掛載到對象的庫,很容易發生命名沖突問題。會先從安裝的包中查找是否有符合的庫。證明在中使用的和都成功指向了庫。 教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步《webpack4 系列教程(十二):處理第三方 JavaScript 庫》原文地址。或者來...
閱讀 2575·2023-04-25 17:33
閱讀 652·2021-11-23 09:51
閱讀 2956·2021-07-30 15:32
閱讀 1404·2019-08-29 18:40
閱讀 1949·2019-08-28 18:19
閱讀 1470·2019-08-26 13:48
閱讀 2245·2019-08-23 16:48
閱讀 2280·2019-08-23 15:56