摘要:插件則可以用于執(zhí)行范圍更廣的任務(wù)。插件的范圍包括,從打包優(yōu)化和壓縮,一直到重新定義環(huán)境中的變量等。插件的使用一般是在的配置信息選項中指定。到這里基本配置已經(jīng)告一段落了,所有配置我已經(jīng)放在倉庫中第二期優(yōu)化教程已出歡迎關(guān)注和提問
1、了解Webpack相關(guān)
什么是webpack
Webpack是一個模塊打包器(bundler)。
在Webpack看來, 前端的所有資源文件(js/json/css/img/less/...)都會作為模塊處理
它將根據(jù)模塊的依賴關(guān)系進行靜態(tài)分析,生成對應的靜態(tài)資源
五個核心概念
Entry:入口起點(entry point)指示 webpack 應該使用哪個模塊,來作為構(gòu)建其內(nèi)部依賴圖的開始。
Output:output 屬性告訴 webpack 在哪里輸出它所創(chuàng)建的 bundles,以及如何命名這些文件,默認值為 ./dist。
Loader:loader 讓 webpack 能夠去處理那些非 JavaScript 文件(webpack 自身只能解析 JavaScript)。
Plugins:插件則可以用于執(zhí)行范圍更廣的任務(wù)。插件的范圍包括,從打包優(yōu)化和壓縮,一直到重新定義環(huán)境中的變量等。
Mode:模式,有生產(chǎn)模式production和開發(fā)模式development
理解Loader
Webpack 本身只能加載JS/JSON模塊,如果要加載其他類型的文件(模塊),就需要使用對應的loader 進行轉(zhuǎn)換/加載
Loader 本身也是運行在 node.js 環(huán)境中的 JavaScript 模塊
它本身是一個函數(shù),接受源文件作為參數(shù),返回轉(zhuǎn)換的結(jié)果
loader 一般以 xxx-loader 的方式命名,xxx 代表了這個 loader 要做的轉(zhuǎn)換功能,比如 json-loader。
理解Plugins
插件可以完成一些loader不能完成的功能。
插件的使用一般是在 webpack 的配置信息 plugins 選項中指定。
配置文件(默認)
webpack.config.js : 是一個node模塊,返回一個 json 格式的配置信息對象
2、開啟項目
初始化項目:
生成package.json文件
{ "name": "webpack_test", "version": "1.0.0" }
安裝webpack
npm install webpack webpack-cli -g //全局安裝
npm install webpack webpack-cli -D //本地安裝
3、編譯打包應用
創(chuàng)建js文件
src/js/app.js
src/js/module1.js
src/js/module2.js
src/js/module3.js
創(chuàng)建json文件
src/json/data.json
創(chuàng)建主頁面:
src/index.html
運行指令
開發(fā)配置指令:webpack src/js/app.js -o dist/js/app.js --mode=development
功能: webpack能夠編譯打包js和json文件,并且能將es6的模塊化語法轉(zhuǎn)換成瀏覽器能識別的語法
生產(chǎn)配置指令:webpack src/js/app.js -o dist/js/app.js --mode=production
功能: 在開發(fā)配置功能上加上一個壓縮代碼
結(jié)論:
webpack能夠編譯打包js和json文件
能將es6的模塊化語法轉(zhuǎn)換成瀏覽器能識別的語法
能壓縮代碼
缺點:
不能編譯打包css、img等文件
不能將js的es6基本語法轉(zhuǎn)化為es5以下語法
改善:使用webpack配置文件解決,自定義功能
4、使用webpack配置文件目的:在項目根目錄定義配置文件,通過自定義配置文件,還原以上功能
文件名稱:webpack.config.js
文件內(nèi)容:
const {resolve} = require("path"); //node內(nèi)置核心模塊,用來設(shè)置路徑。 module.exports = { entry: "./src/js/app.js", // 入口文件 output: { // 輸出配置 filename: "./js/bundle.js", // 輸出文件名 path: resolve(__dirname, "dist") //輸出文件路徑配置 }, mode: "development" //開發(fā)環(huán)境(二選一) mode: "production" //生產(chǎn)環(huán)境(二選一) };
運行指令: webpack
5、js語法檢查
安裝loader
npm install eslint-loader eslint --save-dev
配置loader
module: { rules: [ { test: /.js$/, //只檢測js文件 exclude: /node_modules/, //排除node_modules文件夾 enforce: "pre", //提前加載使用 use: { //使用eslint-loader解析 loader: "eslint-loader" } } ] }
修改package.json(需要刪除注釋才能生效)
"eslintConfig": { //eslint配置 "parserOptions": { "ecmaVersion": 8, // es8 "sourceType": "module", // ECMAScript 模塊 } }
運行指令:webpack
6、js語法轉(zhuǎn)換
安裝loader
npm install babel-loader @babel/core @babel/preset-env --save-dev
配置loader
module: { rules: [ { oneOf: [ //數(shù)組中的配置只有一個能夠生效, 后面的配置都會放在當前數(shù)組中 { test: /.js$/, exclude: /node_modules/, use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"] } } } ] } ] }
運行指令:webpack
7、打包less資源
創(chuàng)建less文件
src/less/test1.less
src/less/test2.less
入口app.js文件
引入less資源
安裝loader
npm install css-loader style-loader less-loader less --save-dev
配置loader
oneOf: [ { test: /.less$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }, { loader: "less-loader" }] } ]
運行指令:webpack
在index.html中引入打包生成的dist/js/bundle.js文件,觀察效果
8、打包樣式文件中的圖片資源
添加2張圖片:
小圖, 小于8kb: src/images/1.png
大圖, 大于8kb: src/images/2.jpg
在less文件中通過背景圖的方式引入圖片
安裝loader
npm install file-loader url-loader --save-dev
補充:url-loader是對象file-loader的上層封裝,使用時需配合file-loader使用。
配置loader
{ test: /.(png|jpg|gif|svg)$/, use: [ { loader: "url-loader", options: { outputPath: "images/", //在output基礎(chǔ)上,修改輸出圖片文件的位置 publicPath: "../dist/images/", //修改背景圖引入url的路徑 limit: 8 * 1024, // 8kb大小以下的圖片文件都用base64處理 name: "[hash:8].[ext]" // hash值為7位,ext自動補全文件擴展名 } } ] }
運行指令:webpack
在index.html中引入打包生成的dist/js/bundle.js文件,觀察效果
9、打包html文件
添加html文件
src/index.html
注意不要在html中引入任何css和js文件
安裝插件Plugins
npm install clean-webpack-plugin --save-dev
在webpack.config.js中引入插件(插件都需要手動引入,而loader會自動加載)
const CleanWebpackPlugin = require("clean-webpack-plugin")
配置插件Plugins
plugins: [ new HtmlWebpackPlugin({ template: "./src/index.html" }), ]
運行指令:webpack
10、打包html中圖片資源
添加圖片
在src/index.html添加兩個img標簽
安裝loader
npm install html-loader --save-dev
修改entry
entry: ["./src/js/app.js", "./src/index.html"]
配置loader
{ test: /.(html)$/, use: { loader: "html-loader" } }
運行指令:webpack
11、打包其他資源
添加字體文件
src/media/iconfont.eot
src/media/iconfont.svg
src/media/iconfont.ttf
src/media/iconfont.woff
src/media/iconfont.woff2
修改樣式
@font-face { font-family: "iconfont"; src: url("../media/iconfont.eot"); src: url("../media/iconfont.eot?#iefix") format("embedded-opentype"), url("../media/iconfont.woff2") format("woff2"), url("../media/iconfont.woff") format("woff"), url("../media/iconfont.ttf") format("truetype"), url("../media/iconfont.svg#iconfont") format("svg"); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
修改html,添加字體
配置loader
{ loader: "file-loader", exclude: [/.js$/, /.html$/, /.json$/], options: { outputPath: "media/", publicPath: "../dist/media/", name: "[hash:8].[ext]", }, }
運行指令:webpack
12、自動編譯打包運行
安裝loader
npm install webpack-dev-server --save-dev
引入webpack
const webpack = require("webpack");
修改webpack配置對象(注意不是loader中)
devtool: "inline-source-map", // 將編譯后的代碼映射回原始源代碼,更容易地追蹤錯誤和警告 devServer: { contentBase: "./dist", //項目根路徑 hot: true, //開啟熱模替換功能 open: true //自動打開瀏覽器 }, plugins: [ new webpack.NamedModulesPlugin(), new webpack.HotModuleReplacementPlugin() ]
修改loader部分配置
因為構(gòu)建工具以dist為根目錄,不用再找dist了
publicPath: "../dist/images/" --> publicPath: "images/"
publicPath: "../dist/media/" --> publicPath: "media/"
修改package.json中scripts指令
"start": "webpack-dev-server",
"dev": "webpack-dev-server"
運行指令:npm start / npm run dev
以上就是webpack開發(fā)環(huán)境的配置,可以在內(nèi)存中自動打包所有類型文件并有自動編譯運行、熱更新等功能。13、準備生產(chǎn)環(huán)境
創(chuàng)建文件夾config,將webpack.config.js復制兩份
webpack.dev.js
webpack.prod.js
修改webpack.prod.js配置,刪除webpack-dev-server配置
module.exports = { output: { filename: "js/[name].[hash:8].js", //添加了hash值, 實現(xiàn)靜態(tài)資源的長期緩存 publicPath: "/" //所有輸出資源公共路徑 }, module: { //loader其他沒有變化,只放了變化部分,只有需要修改路徑部分改了 rules: [ { oneOf: [ { test: /.(png|jpg|gif|svg)$/, use: [ { loader: "url-loader", options: { limit: 8 * 1024, // 8kb大小以下的圖片文件都用base64處理 name: "images/[name].[hash:8].[ext]" } } ] }, { loader: "file-loader", exclude: [/.js$/, /.html$/, /.json$/], options: { name: "media/[name].[hash:8].[ext]", }, } ] } ] }, mode: "production", //修改為生產(chǎn)環(huán)境 }
修改package.json的指令
"start": "webpack-dev-server --config ./config/webpack.dev.js"
"dev": "webpack-dev-server --config ./config/webpack.dev.js"
"build": "webpack --config ./config/webpack.prod.js"
開發(fā)環(huán)境指令
npm start
npm run dev
生產(chǎn)環(huán)境指令
npm run build
注意: 生產(chǎn)環(huán)境代碼需要部署到服務(wù)器上才能運行
npm i serve -g
serve -s dist
14、清除打包文件目錄
安裝插件
npm install clean-webpack-plugin --save-dev
引入插件
const CleanWebpackPlugin = require("clean-webpack-plugin");
配置插件
new CleanWebpackPlugin()
運行指令:npm run build
15、提取css成多帶帶文件
安裝插件
npm install mini-css-extract-plugin --save-dev
引入插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
配置loader
{ test: /.less$/, use: [ MiniCssExtractPlugin.loader, "css-loader", "less-loader", ] }
配置插件
new MiniCssExtractPlugin({ filename: "css/[name].[hash:8].css", chunkFilename: "css/[id].[hash:8].css" })
運行指令
npm run build
serve -s dist
16、添加css兼容
安裝loader
npm install postcss-loader autoprefixer --save-dev
配置loader
{ test: /.less$/, use: [ MiniCssExtractPlugin.loader, "css-loader", "postcss-loader", "less-loader", ] }
在項目根目錄添加postcss配置文件:postcss.config.js
module.exports = { "plugins": { "autoprefixer": { "browsers": [ "ie >= 8", "ff >= 30", "chrome >= 34", "safari >= 8", "opera >= 23" ] } } }
運行指令:
npm run build
serve -s dist
17、壓縮css
安裝插件
npm install optimize-css-assets-webpack-plugin --save-dev
引入插件
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin");
配置插件
new OptimizeCssAssetsPlugin({ cssProcessorPluginOptions: { preset: ["default", { discardComments: { removeAll: true } }], }, })
運行指令:
npm run build
serve -s dist
18、圖片壓縮
安裝loader
npm install img-loader imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo imagemin --save-dev
配置loader
{ test: /.(png|jpg|gif|svg)$/, use: [ { loader: "url-loader", options: { limit: 8 * 1024, // 8kb大小以下的圖片文件都用base64處理 name: "images/[name].[hash:8].[ext]" } }, { loader: "img-loader", options: { plugins: [ require("imagemin-gifsicle")({ interlaced: false }), require("imagemin-mozjpeg")({ progressive: true, arithmetic: false }), require("imagemin-pngquant")({ floyd: 0.5, speed: 2 }), require("imagemin-svgo")({ plugins: [ { removeTitle: true }, { convertPathData: false } ] }) ] } } ] }
運行指令:
npm run build
serve -s dist
19、壓縮html
修改插件配置
new HtmlWebpackPlugin({ template: "./src/index.html", minify: { removeComments: true, collapseWhitespace: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeStyleLinkTypeAttributes: true, keepClosingSlash: true, minifyJS: true, minifyCSS: true, minifyURLs: true, } })
運行指令:
npm run build
serve -s dist
以上就是webpack生產(chǎn)環(huán)境的配置,可以生成打包后的文件。到這里基本配置已經(jīng)告一段落了,所有配置我已經(jīng)放在 倉庫 中
第二期 Webpack4優(yōu)化教程 已出~ 歡迎關(guān)注和提問~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102624.html
摘要:寫在前面準備學習一下和相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個,參考了這個文檔從零搭建全家桶框架教程步驟上都差不多第一步,依賴總覽完成到我現(xiàn)在半成品的過程中,目前完成開發(fā)模式的相關(guān)操作,添加了按需加載的地步。 寫在前面 準備學習一下react和webpack相關(guān)的東西,官方的腳手架看起來太繁瑣,所以打算自己來搭建一個,參考了這個文檔從零搭建React全家桶框架教程;...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:后來經(jīng)過排查你會發(fā)現(xiàn)是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創(chuàng)建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現(xiàn)在能找到自己手動創(chuàng)建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現(xiàn)在一般的做...
閱讀 866·2021-11-15 11:37
閱讀 3604·2021-11-11 16:55
閱讀 3270·2021-11-11 11:01
閱讀 999·2019-08-30 15:43
閱讀 2743·2019-08-30 14:12
閱讀 681·2019-08-30 12:58
閱讀 3389·2019-08-29 15:19
閱讀 2025·2019-08-29 13:59