摘要:支持轉(zhuǎn)義轉(zhuǎn)義需要的依賴,支持裝飾器。在中增加的配置數(shù)組中。壓縮文件安裝依賴在中的中增加配置打包前先清空輸出目錄在中增加的配置至此,配置已經(jīng)基本能滿足需求。
webpack 核心概念:
Entry: 入口
Module:模塊,webpack中一切皆是模塊
Chunk:代碼庫(kù),一個(gè)chunk由十多個(gè)模塊組合而成,用于代碼合并與分割
Loader:模塊轉(zhuǎn)換器,用于把模塊原內(nèi)容按照需求轉(zhuǎn)換成新內(nèi)容
Plugin:擴(kuò)展插件,在webpack構(gòu)建流程中的特定時(shí)機(jī)注入擴(kuò)展邏輯來改變構(gòu)建結(jié)果或做你想要做的事情
Output: 輸出結(jié)果
webpack流程:
webpack啟動(dòng)后會(huì)從 Entry 里配置的 Module 開始遞歸解析 Entry 依賴的所有Module.每找到一個(gè)Module,就會(huì)根據(jù)配置的Loader去找出對(duì)應(yīng)的轉(zhuǎn)換規(guī)則,對(duì)Module進(jìn)行轉(zhuǎn)換后,再解析出當(dāng)前的Module依賴的Module.這些模塊會(huì)以Entry為單位進(jìn)行分組,一個(gè)Entry和其所有依賴的Module被分到一個(gè)組也就是一個(gè)Chunk。最好Webpack會(huì)把所有Chunk轉(zhuǎn)換成文件輸出。在整個(gè)流程中Webpack會(huì)在恰當(dāng)?shù)臅r(shí)機(jī)執(zhí)行Plugin里定義的邏輯。
下面我們開始從零開始配置一個(gè)支持打包圖片,CSS,LESS,SASS,支持ES6/ES7和JSX語(yǔ)法,并對(duì)代碼進(jìn)行壓縮的webpack配置.
1. 最簡(jiǎn)webpack配置
首先初始化npm和安裝webpack的依賴:
npm init -y npm install --save-dev webpack webpack-cli
配置 webpack.config.js 文件如下:
const path = require("path"); module.exports = { entry: path.resolve(__dirname, "src/index.js"), output: { path: path.resolve(__dirname, "dist"), filename: "bundle.js", publicPath: "/" } }
說明: publicPath 上線時(shí)配置的是cdn的地址。
使用命令進(jìn)行打包:
webpack --mode production
也可以將其配置到 package.json 中的 scripts 字段.
入口文件為 src/index.js, 打包輸出到 dist/bundle.js.
2. 使用模板 html
html-webpack-plugin 可以指定template模板文件,將會(huì)在output目錄下,生成html文件,并引入打包后的js.
安裝依賴:
npm install --save-dev html-webpack-plugin
在 webpack.config.js 增加 plugins 配置:
const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { //...other code plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, "src/index.html") }) ] }
HtmlWebpackPlugin 還有一些其它的參數(shù),如title(html的title),minify(是否要壓縮),filename(dist中生成的html的文件名)等
3. 配置 webpack-dev-server
webpack-dev-server提供了一個(gè)簡(jiǎn)單的Web服務(wù)器和實(shí)時(shí)熱更新的能力
安裝依賴:
npm install --save-dev webpack-dev-server
在 webpack.config.js 增加 devServer 配置:
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { //...other code devServer: { contentBase: "./dist", port: "8080", host: "localhost" } }
在 package.json 的 scripts 字段中增加:
webpack-dev-server --mode development
之后,我們就可以通過 npm run dev , 來啟動(dòng)服務(wù)。
更多 webpack-dev-server 的知識(shí),請(qǐng)?jiān)L問: https://webpack.js.org/config...
4. 支持加載css文件
通過使用不同的 style-loader 和 css-loader, 可以將 css 文件轉(zhuǎn)換成JS文件類型。
安裝依賴:
npm install --save-dev style-loader css-loader
在 webpack.config.js 中增加 loader 的配置。
module.exports = { //other code module: { rules: [ { test: /.css/, use: ["style-loader", "css-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") } ] } }
loader 可以配置以下參數(shù):
test: 匹配處理文件的擴(kuò)展名的正則表達(dá)式
use: loader名稱
include/exclude: 手動(dòng)指定必須處理的文件夾或屏蔽不需要處理的文件夾
query: 為loader提供額外的設(shè)置選項(xiàng)
如果需要給loader傳參,那么可以使用use+loader的方式,如:
module.exports = { //other code module: { rules: [ { use: [{ loader: "style-loader", options: { insertAt: "top" } }, "css-loader" ], //.... } ] } }
5. 支持加載圖片
file-loader: 解決CSS等文件中的引入圖片路徑問題
url-loader: 當(dāng)圖片小于limit的時(shí)候會(huì)把圖片Base64編碼,大于limit參數(shù)的時(shí)候還是使用file-loader進(jìn)行拷貝
如果希望圖片存放在多帶帶的目錄下,那么需要指定outputPath
安裝依賴:
npm install --save-dev url-loader file-loader
在 webpack.config.js 中增加 loader 的配置(增加在 module.rules 的數(shù)組中)。
module.exports = { //other code module: { rules: [ { test: /.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/, use: [ { loader: "url-loader", options: { limit: 8192, outputPath: "images" } } ] } ] } }
6.支持編譯less和sass
有些前端同事可能習(xí)慣于使用less或者是sass編寫css,那么也需要在 webpack 中進(jìn)行配置。
安裝對(duì)應(yīng)的依賴:
npm install --save-dev less less-loader npm install --save-dev node-sass sass-loader
在 webpack.config.js 中增加 loader 的配置(module.rules 數(shù)組中)。
module.exports = { //other code module: { rules: [ { test: /.less/, use: ["style-loader", "css-loader", "less-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.scss/, use: ["style-loader", "css-loader", "sass-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") } ] } }
7.支持轉(zhuǎn)義 ES6/ES7/JSX
ES6/ES7/JSX 轉(zhuǎn)義需要 Babel 的依賴,支持裝飾器。
npm install --save-dev @babel/core babel-loader @babel/preset-env @babel/preset-react @babel/plugin-proposal-decorators @babel/plugin-proposal-object-rest-spread
在 webpack.config.js 中增加 loader 的配置(module.rules 數(shù)組中)。
module.exports = { //other code module: { rules: [ { test: /.jsx?$/, use: [ { loader: "babel-loader", options: { presets: ["@babel/preset-env", "@babel/react"], plugins: [ [require("@babel/plugin-proposal-decorators"), { "legacy": true }] ] } } ], include: path.resolve(__dirname, "src"), exclude: /node_modules/ }, ] } }
8.壓縮JS文件
安裝依賴:
npm install --save-dev uglifyjs-webpack-plugin npm install --save-dev optimize-css-assets-webpack-plugin
在 webpack.config.js 中增加 optimization 的配置
const UglifyWebpackPlugin = require("uglifyjs-webpack-plugin"); module.exports = { //other code optimization: { minimizer: [ new UglifyWebpackPlugin({ parallel: 4 }) ] } }
9.分離CSS(如果CSS文件較大的話)
因?yàn)镃SS的下載和JS可以并行,當(dāng)一個(gè)HTML文件很大的時(shí)候,可以把CSS多帶帶提取出來加載
npm install --save-dev mini-css-extract-plugin
在 webpack.config.js 中增加 plugins 的配置,并且將 "style-loader" 修改為 { loader: MiniCssExtractPlugin.loader}。
CSS打包在多帶帶目錄,那么配置filename。
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { //other code module: { rules: [ { test: /.css/, use: [{ loader: MiniCssExtractPlugin.loader}, "css-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.less/, use: [{ loader: MiniCssExtractPlugin.loader }, "css-loader", "less-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.scss/, use: [{ loader: MiniCssExtractPlugin.loader }, "css-loader", "sass-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, ] }, plugins: [ new MiniCssExtractPlugin({ filename: "css/[name].css" }) ] }
10.壓縮CSS文件
安裝依賴:
npm install --save-dev optimize-css-assets-webpack-plugin
在 webpack.config.js 中的 optimization 中增加配置
const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin"); module.exports = { //other code optimization: { minimizer: [ new OptimizeCssAssetsWebpackPlugin() ] } }
11.打包前先清空輸出目錄
npm install --save-dev clean-webpack-plugin
在 webpack.config.js 中增加 plugins 的配置
const CleanWebpackPlugin = require("clean-webpack-plugin"); module.exports = { //other code plugins: [ new CleanWebpackPlugin() ] }
至此,webpack配置已經(jīng)基本能滿足需求。
完整webpack.config.js和package.json文件
webpack.config.js文件:
const path = require("path"); const htmlWebpackPlugin = require("html-webpack-plugin"); const UglifyWebpackPlugin = require("uglifyjs-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin"); module.exports = { entry: path.resolve(__dirname, "src/index.js"), output: { path: path.resolve(__dirname, "dist"), filename: "bundle.js", publicPath: "/" }, devServer: { contentBase: "./dist", port: "8080", host: "localhost" }, module: { rules: [ { test: /.jsx?$/, use: [ { loader: "babel-loader", options: { presets: ["@babel/preset-env", "@babel/react"], plugins: [ [require("@babel/plugin-proposal-decorators"), { "legacy": true }] ] } } ], include: path.resolve(__dirname, "src"), exclude: /node_modules/ }, { test: /.css/, use: [{ loader: MiniCssExtractPlugin.loader}, "css-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.less/, use: [{ loader: MiniCssExtractPlugin.loader }, "css-loader", "less-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.scss/, use: [{ loader: MiniCssExtractPlugin.loader }, "css-loader", "sass-loader"], exclude: /node_modules/, include: path.resolve(__dirname, "src") }, { test: /.(gif|jpg|png|bmp|eot|woff|woff2|ttf|svg)/, use: [ { loader: "url-loader", options: { limit: 1024, outputPath: "images" } } ] } ] }, optimization: { minimizer: [ new UglifyWebpackPlugin({ parallel: 4 }), new OptimizeCssAssetsWebpackPlugin() ] }, plugins: [ new htmlWebpackPlugin({ template: path.resolve(__dirname, "src/index.html"), }), new MiniCssExtractPlugin({ filename: "css/[name].css" }), new CleanWebpackPlugin() ] }
package.json文件:
{ "name": "webpk", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "test": "echo "Error: no test specified" && exit 1", "build": "webpack --mode production", "dev": "webpack-dev-server --mode development" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@babel/core": "^7.4.0", "@babel/plugin-proposal-decorators": "^7.4.0", "@babel/plugin-proposal-object-rest-spread": "^7.4.0", "@babel/preset-env": "^7.4.1", "@babel/preset-react": "^7.0.0", "babel-loader": "^8.0.5", "clean-webpack-plugin": "^2.0.1", "css-loader": "^2.1.1", "file-loader": "^3.0.1", "html-webpack-plugin": "^3.2.0", "less": "^3.9.0", "less-loader": "^4.1.0", "mini-css-extract-plugin": "^0.5.0", "node-sass": "^4.11.0", "optimize-css-assets-webpack-plugin": "^5.0.1", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", "uglifyjs-webpack-plugin": "^2.1.2", "url-loader": "^1.1.2", "webpack": "^4.29.6", "webpack-cli": "^3.3.0", "webpack-dev-server": "^3.2.1" }, "dependencies": { "react": "^16.8.4", "react-dom": "^16.8.4", "react-redux": "^6.0.1", "redux": "^4.0.1" } }
更多l(xiāng)oader和plugin的參數(shù)可以參考:
https://www.webpackjs.com/loa...
https://www.webpackjs.com/plu...
謝謝您花費(fèi)寶貴的時(shí)間閱讀本文,如果本文給了您一點(diǎn)幫助或者是啟發(fā),那么不要吝嗇你的贊和Star哈,您的肯定是我前進(jìn)的最大動(dòng)力。https://github.com/YvetteLau/...
如果你有其它的webpack配置需求,歡迎留言~
關(guān)注小姐姐的公眾號(hào),和小姐姐一起學(xué)前端。文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102740.html
摘要:寫在前面準(zhǔn)備學(xué)習(xí)一下和相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個(gè),參考了這個(gè)文檔從零搭建全家桶框架教程步驟上都差不多第一步,依賴總覽完成到我現(xiàn)在半成品的過程中,目前完成開發(fā)模式的相關(guān)操作,添加了按需加載的地步。 寫在前面 準(zhǔn)備學(xué)習(xí)一下react和webpack相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個(gè),參考了這個(gè)文檔從零搭建React全家桶框架教程;...
摘要:目錄第課安裝和第課配置文件第課做為的一個(gè)模塊來使用第課插件篇第課模塊篇第課在開發(fā)中使用本文參考文檔官方模塊配置模塊配置中文翻譯模塊配置中文翻譯版本官方內(nèi)置清單第三方清單代碼托管及用法配置官方文檔模塊總覽我是首頁(yè)萬事開頭 webpack目錄 第1課: 安裝webpack和webpack-dev-server 第2課: 配置文件 第3課: 做為node的一個(gè)模塊來使用 第4課: ...
摘要:前言想想也已經(jīng)做過不少架構(gòu)的項(xiàng)目了,有基于,基于,基于,基于的。好了,介紹完畢,接下來,我就從零開始,一步一步建起前后端完全分離的前端架構(gòu)了。 前言 想想也已經(jīng)做過不少架構(gòu)的項(xiàng)目了,有基于vue,基于react,基于thinkPHP,基于laravel的。 做多了,也就對(duì)現(xiàn)有的架構(gòu)有各種想法,有好的,有壞的,總之,用起來還是不爽。vue-cli雖然可以很快地構(gòu)建并使用,尤其是vue-c...
摘要:最近在學(xué)習(xí)語(yǔ)法,故有了從零開始搭建環(huán)境的想法。默認(rèn)會(huì)將這些輔助函數(shù)內(nèi)聯(lián)到每一個(gè)文件里,這樣文件多的時(shí)候,項(xiàng)目就會(huì)很大。 最近在學(xué)習(xí)ES6語(yǔ)法,故有了從零開始搭建ES6環(huán)境的想法。下面第一部分是單純的ES6環(huán)境配置,第二部分是基于webpack環(huán)境的工程配置 1. 純ES6環(huán)境配置 1.1 packages中的依賴項(xiàng): devDependencies: { babel-cli: ^6...
摘要:優(yōu)化代碼拆分從入口文件開始,遞歸地構(gòu)建了整個(gè)應(yīng)用的模塊依賴圖表,然后通常會(huì)將所有的模塊打包成一個(gè)。 如果你還不知道什么是React,請(qǐng)點(diǎn)擊這里github源碼 安裝Node.js 如果你還不知道什么是ECMAScript,請(qǐng)點(diǎn)擊這里 如果你還不知道什么是Node.js,請(qǐng)點(diǎn)擊這里 下載Node.js并安裝;接著打開windows命令行窗口分別輸入node -v及npm -v如下圖所示,...
閱讀 1726·2021-11-22 15:33
閱讀 2102·2021-10-08 10:04
閱讀 3554·2021-08-27 13:12
閱讀 3428·2019-08-30 13:06
閱讀 1477·2019-08-29 16:43
閱讀 1400·2019-08-29 16:40
閱讀 794·2019-08-29 16:15
閱讀 2752·2019-08-29 14:13