摘要:配置如上圖測(cè)試用例所示,由于這個(gè)插件默認(rèn)使用了來(lái)作優(yōu)化,所以它不僅壓縮了代碼刪掉了代碼中無(wú)用的注釋還去除了冗余的優(yōu)化了的書(shū)寫順序,優(yōu)化了你的代碼。
webpack基本使用
// webpack4中除了正常安裝webpack之外,需要再多帶帶安一個(gè)webpack-cli npm i webpack webpack-cli -D基本命令行
webpack
直接輸入webpack,默認(rèn)執(zhí)行: webpack.config.js or webpackfile.js文件;
如果想自定義文件名,運(yùn)行:webpack --config webpack.conf.dev.js
// ESmodule export default function(a,b){ return a+b } import sum from "./sum" // common.js規(guī)范 module.exports = function(a,b){ return a-b } var minus = require("./minus") // AMD規(guī)范,多了兩個(gè)bundle,異步加載 //amd規(guī)范 define(function(require, factory) { "use strict"; return function(a,b){ return a*b } }); require(["./muti"],function(muti){ console.log("muti,23,24="+muti(23,24)) }) console.log("sum,23,24="+sum(23,24)) console.log("minus,23,24="+minus(23,24))編譯 ES 6/7
安裝babel-loader, babel-core, babel-preset-env
npm install --save-dev babel-loader babel-core babel-preset-env
babel-loader:在import或加載模塊時(shí),對(duì)es6代碼進(jìn)行預(yù)處理,es6語(yǔ)法轉(zhuǎn)化為es5語(yǔ)法。
babel-core:允許我們?nèi)フ{(diào)用babel的api,可以將js代碼分析成ast(抽象語(yǔ)法樹(shù)),方便各個(gè)插件分析語(yǔ)法進(jìn)行相應(yīng)的處理.
babel-preset-env:為了告訴babel只編譯批準(zhǔn)的內(nèi)容,相當(dāng)于babel-preset-es2015, es2016, es2017及最新版本。通過(guò)它可以使用最新的js語(yǔ)法。
配置webpack.config.js
module.exports = { entry:{ app:"./app.js" }, output:{ filename:"[name].[hash:5].js" }, module:{ rules:[ { test:/.js$/, use:{ loader:"babel-loader", options:{ presets:[ // 最新的版本 ["@babel/preset-env",{ targets:{// 支持目標(biāo),數(shù)據(jù)來(lái)源于‘can i use’網(wǎng)站 browsers:["> 1%","last 2 versions"] //chrome:"52" } }] ] } }, //排除相關(guān)文件 exclude:"/node_modules/" } ] } }
其中,exclude是定義不希望babel處理的文件。targets是presets的一些預(yù)設(shè)選項(xiàng),這里表示將js用于瀏覽器,只確保占比大于1%的瀏覽器的特性,主流瀏覽器的最新兩個(gè)主版本。
更多與配置有關(guān)的信息,可以參考:
babel env preset設(shè)置,
browserlist預(yù)設(shè)置
由于babel-preset配置選項(xiàng)較多,我們一般可以在根目錄下建立.babelrc文件,專門用來(lái)放置babel preset配置,這是一個(gè)json文件。可以將上述配置修改如下:
//.bablerc文件 { "presets": [ ["env",{ "targets": { "browsers": ["> 1%", "last 2 versions"] } }] ] } //原webpack.config.js文件 module: { rules: [ { test: /.js$/, use: { loader: "babel-loader" }, exclude: "/node_modules/" } ] }babel-polifill
在上面的babel配置中,babel只是將一些es6,es7-8的語(yǔ)法轉(zhuǎn)換成符合目標(biāo)的js代碼,但是如果我們使用一些特性或方法,比如Generator, Set, 或者一些方法。babel并不能轉(zhuǎn)換為低版本瀏覽器識(shí)別的代碼。這時(shí)就需要babel-polifill。
簡(jiǎn)單的說(shuō),polifill就是一個(gè)墊片,提供了一些低版本es標(biāo)準(zhǔn)對(duì)高級(jí)特性的實(shí)現(xiàn)。使用polifill的方法如下:
npm install --save babel-polifill
然后在應(yīng)用入口引入polifill,要確保它在任何其他代碼/依賴聲明前被調(diào)用。
//CommonJS module require("babel-polyfill"); //es module import "babel-polifill";
在webpack.config.js中,將babel-polifill加入entry數(shù)組中:
entry: ["babel-polifill", "./app.js"]
相比于runtime-transform,polifill用于應(yīng)用開(kāi)發(fā)中。會(huì)添加相應(yīng)變量到全局,所以會(huì)污染全局變量。
更多配置參考:babel-polifill
完整代碼如下:
const path = require("path"); module.exports = { //entry為入口,webpack從這里開(kāi)始編譯 entry: [ "babel-polyfill", path.join(__dirname, "./src/index.js") ], //output為輸出 path代表路徑 filename代表文件名稱 output: { path: path.join(__dirname, "./bundle"), filename: "bundle.js" }, //module是配置所有模塊要經(jīng)過(guò)什么處理 //test:處理什么類型的文件,use:用什么,include:處理這里的,exclude:不處理這里的 module: { rules: [ { test: /.js$/, use: ["babel-loader"], include: path.join(__dirname , "src"), exclude: /node_modules/ } ] }, };runtime-transform插件
runtime transform也是一個(gè)插件,它與polifill有些類似,但它不污染全局變量,所以經(jīng)常用于框架開(kāi)發(fā)。
安裝:
*npm install --save-dev babel-plugin-transform-runtime
npm install --save babel-runtime*
用法:
將下面內(nèi)容添加到.bablerc文件中
{ "plugins": ["transform-runtime"] }
更多配置參考:bable-runtime-transform插件
使用 loader 處理 CSS1 . 安裝處理 css 相關(guān) loader
// css-loader讓你能import css , style-loader能將css以style的形式插入 $ npm install --save-dev css-loader style-loader
module.exports = { plugins: [require("autoprefixer")] // 引用該插件即可了 }
然后在webpack里配置postcss-loader
module.exports = { module: { rules: [ { test: /.css$/, use: ["style-loader", "css-loader", "postcss-loader"] } ] } }
2 . 安裝 less 相關(guān)
npm install --save-dev less less-loader
3 . 添加CSS3前綴
通過(guò)postcss中的autoprefixer可以實(shí)現(xiàn)將CSS3中的一些需要兼容寫法的屬性添加響應(yīng)的前綴,這樣省去我們不少的時(shí)間
npm i postcss-loader autoprefixer -D
創(chuàng)建 postcss.config.js 加入以下代碼
module.exports = { plugins: { "postcss-cssnext": {} } }
4 . 實(shí)現(xiàn)
src/app.css
body { background: pink; }
src/app.js
import css from "./app.css"; console.log("hello world");
// 處理順序從右到左 less -> postcss -> css -> style { test: /.css$/, use: [ "style-loader", "css-loader" ] }
5.用 mini-css-extract-plugin 把 CSS 分離成文件
npm install --save-dev mini-css-extract-plugin
rules: [ { test: /.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] new MiniCssExtractPlugin({ filename: "[name].css",// 指定打包后的css chunkFilename: "[id].css" }),
6.壓縮與優(yōu)化
打包 css 之后查看源碼,我們發(fā)現(xiàn)它并沒(méi)有幫我們做代碼壓縮,這時(shí)候需要使用 optimize-css-assets-webpack-plugin 這個(gè)插件,它不僅能幫你壓縮 css 還能優(yōu)化你的代碼。
npm install --save-dev optimize-css-assets-webpack-plugin
const optimizeCss = require("optimize-css-assets-webpack-plugin"); //配置 optimization: { minimizer: [new OptimizeCSSAssetsPlugin()]; }
如上圖測(cè)試用例所示,由于optimize-css-assets-webpack-plugin這個(gè)插件默認(rèn)使用了 cssnano 來(lái)作 css 優(yōu)化,
所以它不僅壓縮了代碼、刪掉了代碼中無(wú)用的注釋、還去除了冗余的 css、優(yōu)化了 css 的書(shū)寫順序,優(yōu)化了你的代碼 margin: 10px 20px 10px 20px; =>margin:10px 20px;。同時(shí)大大減小了你 css 的文件大小。更多優(yōu)化的細(xì)節(jié)見(jiàn)文檔。
安裝插件npm install --save-dev html-webpack-plugin 配置 webpack.config.js
npm install --save-dev html-webpack-plugin
const htmlWebpackPlugin = require("html-webpack-plugin"); ... plugins: [ new htmlWebpackPlugin({ filename: "index.html", //打包后的文件名 template: path.join(__dirname , "./src/index.html"), // 用哪個(gè)html作為模板,在src目錄下創(chuàng)建一個(gè)index.html頁(yè)面當(dāng)做模板來(lái)用 hash: true, // 會(huì)在打包好的bundle.js后面加上hash串 }) ],
如果需要多頁(yè)面開(kāi)發(fā),可以這樣寫:
let path = require("path"); let HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { // 多頁(yè)面開(kāi)發(fā),怎么配置多頁(yè)面 entry: { index: "./src/index.js", login: "./src/login.js" }, // 出口文件 output: { filename: "[name].js", path: path.resolve("dist") }, plugins: [ new HtmlWebpackPlugin({ template: "./src/index.html", filename: "index.html", chunks: ["index"] // 對(duì)應(yīng)關(guān)系,index.js對(duì)應(yīng)的是index.html }), new HtmlWebpackPlugin({ template: "./src/login.html", filename: "login.html", chunks: ["login"] // 對(duì)應(yīng)關(guān)系,login.js對(duì)應(yīng)的是login.html }) ] }
html-webpack-plugin用法全解
清理打包文件插件$ npm i clean-webpack-plugin --save-dev
const CleanWebpackPlugin = require("clean-webpack-plugin"); ... plugins: [ ... new CleanWebpackPlugin(["bundle"]) //傳入清楚路徑 ]提取公共代碼 原因和優(yōu)勢(shì)
原因
1.相同的資源被重復(fù)的加載,浪費(fèi)用戶的流量和服務(wù)器的成本;
2.每個(gè)頁(yè)面需要加載的資源太大,導(dǎo)致網(wǎng)頁(yè)首屏加載緩慢,影響用戶體驗(yàn)。
優(yōu)點(diǎn)
1.減少網(wǎng)絡(luò)傳輸流量,降低服務(wù)器成本;
2.雖然用戶第一次打開(kāi)網(wǎng)站的速度得不到優(yōu)化,但之后訪問(wèn)其它頁(yè)面的速度將大大提升。
在webpack4之前,提取公共代碼都是通過(guò)一個(gè)叫CommonsChunkPlugin的插件來(lái)辦到的。到了4以后,內(nèi)置了一個(gè)一模一樣的功能,而且起了一個(gè)好聽(tīng)的名字叫“優(yōu)化”
下面我們就來(lái)看看如何提取公共代碼
// 假設(shè)a.js和b.js都同時(shí)引入了jquery.js和一個(gè)寫好的utils.js // a.js和b.js import $ from "jquery"; import {sum} from "utils";
那么他們兩個(gè)js中其中公共部分的代碼就是jquery和utils里的代碼了
可以針對(duì)第三方插件和寫好的公共文件
module.exports = { entry: { a: "./src/a.js", b: "./src/b.js" }, output: { filename: "[name].js", path: path.resolve("dust") }, // 提取公共代碼 + optimization: { splitChunks: { cacheGroups: { vendor: { // 抽離第三方插件 test: /node_modules/, // 指定是node_modules下的第三方包 chunks: "initial", name: "vendor", // 打包后的文件名,任意命名 // 設(shè)置優(yōu)先級(jí),防止和自定義的公共代碼提取時(shí)被覆蓋,不進(jìn)行打包 priority: 10 }, utils: { // 抽離自己寫的公共代碼,utils這個(gè)名字可以隨意起 chunks: "initial", name: "utils", // 任意命名 minSize: 0 // 只要超出0字節(jié)就生成一個(gè)新包 } } } + }, plugins: [ new HtmlWebpackPlugin({ filename: "a.html", template: "./src/index.html", // 以index.html為模板 + chunks: ["vendor", "a"] }), new HtmlWebpackPlugin({ filename: "b.html", template: "./src/index.html", // 以index.html為模板 + chunks: ["vendor", "b"] }) ] }
通過(guò)以上配置,可以把引入到a.js和b.js中的這部分公共代碼提取出來(lái),如下圖所示
webpack-dev-server配置安裝 webpack-dev-server
npm install --save-dev webpack-dev-server
webpack.config.js 添加配置
... devServer: { contentBase: path.join(__dirname, "bundle"), //啟動(dòng)路徑 host:"localhost", //域名,默認(rèn)是localhost port: 8018, //端口號(hào) open: true, //自動(dòng)打開(kāi)瀏覽器 hot: true //開(kāi)啟熱更新 }
當(dāng)然在npm run dev命令下,打包的文件存在于內(nèi)存中,并不會(huì)產(chǎn)生在dist目錄下
熱更新和自動(dòng)刷新的區(qū)別
配置devServer的時(shí)候,如果hot為true,就代表開(kāi)啟了熱更新
But這并沒(méi)那么簡(jiǎn)單,因?yàn)闊岣逻€需要配置一個(gè)webpack自帶的插件并且還要在主要js文件里檢查是否有module.hot
下面就讓我們直接看下代碼是如何實(shí)現(xiàn)的
// webpack.config.js let webpack = require("webpack"); module.exports = { plugins: [ // 熱更新,熱更新不是刷新 new webpack.HotModuleReplacementPlugin() ], devServer: { contentBase: "./dist", hot: true, port: 3000 } } // 此時(shí)還沒(méi)完雖然配置了插件和開(kāi)啟了熱更新,但實(shí)際上并不會(huì)生效 // index.js let a = "hello world"; document.body.innerHTML = a; console.log("這是webpack打包的入口文件"); // 還需要在主要的js文件里寫入下面這段代碼 if (module.hot) { // 實(shí)現(xiàn)熱更新 module.hot.accept(); }編譯圖片
file-loader
對(duì)一些對(duì)象作為文件來(lái)處理,然后可以返回它的URL。
$ npm install --save-dev file-loader
test: /.(gif|png|jpe?g|svg)$/i, use: [ { loader: "file-loader", options: { name: "[name].[ext]", // 文件名和擴(kuò)展名 outputPath: "images/" } },
url-loader
npm i file-loader url-loader -D
module.exports = { module: { rules: [ { test: /.css$/, use: ExtractTextWebpackPlugin.extract({ use: "css-loader", publicPath: "../" }) }, { test: /.(jpe?g|png|gif)$/, use: [ { loader: "url-loader", options: { limit: 8192, // 小于8k的圖片自動(dòng)轉(zhuǎn)成base64格式,并且不會(huì)存在實(shí)體圖片 outputPath: "images/" // 圖片打包后存放的目錄 } } ] } ] } }
解析 html 代碼里面 img 的標(biāo)簽
html-loader: html 變成導(dǎo)出成字符串的過(guò)程中,還能進(jìn)行壓縮處理(minimized)
$ npm install --save-dev html-loader
... { test: /.(gif|png|jpe?g|svg)$/i, use: [ { loader: "file-loader", options: { name: "[name].[ext]", outputPath: "images/" } }, ] }, // 下面幾行才是 html-loader 的配置內(nèi)容 { test: /.html$/, use: [ { loader: "html-loader", options: { minimize: true } }], } ...
壓縮圖片
image-webpack-loader:壓縮圖片文件
$ npm install image-webpack-loader --save-dev
{ test: /.(gif|png|jpe?g|svg)$/i, use: [ { loader: "file-loader", options: { name: "[name].[ext]", outputPath: "images/" } }, { loader: "image-webpack-loader", options: { bypassOnDebug: true, } } ] }, { test: /.html$/, use: [ { loader: "html-loader", options: { minimize: true } }], }resolve解析
在webpack的配置中,resolve我們常用來(lái)配置別名和省略后綴名
module.exports = { resolve: { // 別名 alias: { $: "./src/jquery.js" }, // 省略后綴 extensions: [".js", ".json", ".css"] }, }打包速度
webpack 4 在項(xiàng)目中實(shí)際測(cè)了下,普遍能提高 20%~30%的打包速度。
首先你需要知道你目前打包慢,是慢在哪里。
我們可以用 speed-measure-webpack-plugin 這個(gè)插件,它能監(jiān)控 webpack 每一步操作的耗時(shí)。如下圖:
可以看出其實(shí)大部分打包花費(fèi)的時(shí)間是在Uglifyjs壓縮代碼。和前面的提升熱更新的切入點(diǎn)差不多,查看source map的正確與否,exclude/include的正確使用等等。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97110.html
摘要:引言最近在學(xué)習(xí),發(fā)現(xiàn)好多知識(shí)點(diǎn),之前一點(diǎn)都沒(méi)有接觸過(guò),如等等。使用本地安裝,會(huì)存于文件夾內(nèi)與屬性內(nèi),更方便項(xiàng)目文件遷移以及協(xié)同開(kāi)發(fā)等情況。 引言 最近在學(xué)習(xí)webpack,發(fā)現(xiàn)好多知識(shí)點(diǎn),之前一點(diǎn)都沒(méi)有接觸過(guò),如babel、core-js、browserslist等等。以前習(xí)慣了使用cli構(gòu)建項(xiàng)目,很多東西不用考慮,拿來(lái)就用,這樣的碼農(nóng)是不會(huì)有能力提升的,必須了解更多的知識(shí)點(diǎn),才能成為...
摘要:運(yùn)行該語(yǔ)句會(huì)執(zhí)行如下步驟使用進(jìn)行文件壓縮。設(shè)置環(huán)境變量,觸發(fā)某些包,以不同的方式進(jìn)行編譯。在原始的源碼中執(zhí)行查找和替換操作。等同于表示任何出現(xiàn)的地方都會(huì)被替換為。提供函數(shù)用來(lái)合并配置對(duì)象當(dāng)文件小于限制,會(huì)返回。 選項(xiàng) 1.devtool:通過(guò)在瀏覽器調(diào)試工具(browser devtools)中添加元信息(meta info)增強(qiáng)調(diào)試。 2.resolve.alias:創(chuàng)建 impor...
摘要:新搭建的個(gè)人博客,本文地址學(xué)習(xí)筆記環(huán)境搭建本文的書(shū)寫環(huán)境為,之后會(huì)補(bǔ)充下的差異創(chuàng)建學(xué)習(xí)目錄初始化項(xiàng)目根據(jù)相關(guān)提示完善信息,入口文件安裝相關(guān)包,并且使用也就是支持,需要包,因?yàn)槲抑白鰝€(gè)一些相關(guān)項(xiàng)目,所以部分包已經(jīng)全局安裝,比如等等,大家 新搭建的個(gè)人博客,本文地址:React學(xué)習(xí)筆記1:環(huán)境搭建 本文的書(shū)寫環(huán)境為mac,之后會(huì)補(bǔ)充windows下的差異 1、創(chuàng)建學(xué)習(xí)目錄 mkdir l...
摘要:前言在上一篇文章中我介紹了學(xué)習(xí)前的準(zhǔn)備工作,下面開(kāi)始的學(xué)習(xí)。目標(biāo)一般我們接觸到的關(guān)于的文章,都是以解讀官方文檔為主,而且是針對(duì)單頁(yè)面項(xiàng)目的應(yīng)用。我先在假設(shè)要做一個(gè)多頁(yè)面應(yīng)用,該如何去通過(guò)打包。 前言 在上一篇文章中我介紹了學(xué)習(xí)webpack前的準(zhǔn)備工作,下面開(kāi)始webpack的學(xué)習(xí)。 *創(chuàng)建webpack-demo文件夾 $ mkdir webpack-demo $ cd webpac...
摘要:前言在上一篇文章中我介紹了學(xué)習(xí)前的準(zhǔn)備工作,下面開(kāi)始的學(xué)習(xí)。目標(biāo)一般我們接觸到的關(guān)于的文章,都是以解讀官方文檔為主,而且是針對(duì)單頁(yè)面項(xiàng)目的應(yīng)用。我先在假設(shè)要做一個(gè)多頁(yè)面應(yīng)用,該如何去通過(guò)打包。 前言 在上一篇文章中我介紹了學(xué)習(xí)webpack前的準(zhǔn)備工作,下面開(kāi)始webpack的學(xué)習(xí)。 *創(chuàng)建webpack-demo文件夾 $ mkdir webpack-demo $ cd webpac...
閱讀 1554·2023-04-25 18:56
閱讀 1499·2021-09-29 09:34
閱讀 1717·2021-09-22 15:51
閱讀 3520·2021-09-14 18:03
閱讀 1173·2021-07-23 17:54
閱讀 2031·2019-08-29 18:38
閱讀 2911·2019-08-29 12:38
閱讀 619·2019-08-26 13:41