摘要:進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置一進(jìn)擊基礎(chǔ)篇三配置二不解析不依賴第三方模塊的模塊有一些第三方模塊,它本身不依賴于其他模塊,比如,,不去編譯這些庫(kù),會(huì)使得打包更加快速是個(gè)正則或者包含正則的數(shù)組不去解析忽略
進(jìn)擊webpack 4 (基礎(chǔ)篇一)
進(jìn)擊webpack4 (基礎(chǔ)篇二:配置 一)
進(jìn)擊webpack4 (基礎(chǔ)篇三:配置 二)
noParse
有一些第三方模塊,它本身不依賴于其他模塊,比如jquery,lodash,不去編譯這些庫(kù),會(huì)使得webpack打包更加快速
noParse是個(gè)正則或者包含正則的數(shù)組 RegExp | [RegExp]
module:{ noParse:/jquery/, //不去解析jquery rules:[ //... ] }, ---------------------忽略某些庫(kù)內(nèi)的第三方模塊
ignorePlugin
以moment這個(gè)時(shí)間庫(kù)為例, 導(dǎo)入moment的同時(shí), moment會(huì)引入自身依賴的語言包,這些語言包其中有部分是我們不需要用到的,moment內(nèi)部代碼
plugins: [ new webpack.IgnorePlugin(/^./locale$/, /moment$/) ],
2個(gè)參數(shù)代表的意思是:
當(dāng)匹配到moment這個(gè)庫(kù)的時(shí)候 引入moment并且忽略moment里面匹配到locale的庫(kù)
這個(gè)時(shí)候我們?nèi)绻胍约盒枰膌ocale 需在main.js手動(dòng)引入
import "moment/locale/zh-cn"動(dòng)態(tài)鏈接庫(kù)
另起一個(gè)webpack.config.dll.js 專門用來生成動(dòng)態(tài)鏈接庫(kù)
//webpack.config.dll.js const path=require("path"); const webpack=require("webpack"); module.exports={ mode:"development", entry: { react:["react","react-dom"], jquery:["jquery"] },// 把 React 相關(guān)模塊的放到一個(gè)多帶帶的動(dòng)態(tài)鏈接庫(kù) output: { path: path.resolve(__dirname,"dist"),// 輸出的文件都放到 dist 目錄下 filename: "[name].dll.js",//輸出的動(dòng)態(tài)鏈接庫(kù)的文件名稱,[name] 代表當(dāng)前動(dòng)態(tài)鏈接庫(kù)的名稱 library: "_dll_[name]",//存放動(dòng)態(tài)鏈接庫(kù)的全局變量名稱,例如對(duì)應(yīng) react 來說就是 _dll_react }, plugins: [ new webpack.DllPlugin({ // 動(dòng)態(tài)鏈接庫(kù)的全局變量名稱,需要和 output.library 中保持一致 // 該字段的值也就是輸出的 mainfest.json 文件 中 name 字段的值 // 例如 react.manifest.json 中就有 "name": "_dll_react" name: "_dll_[name]", // 描述動(dòng)態(tài)鏈接庫(kù)的 manifest.json 文件輸出時(shí)的文件名稱 path: path.join(__dirname, "dist", "[name].mainfest.json") }) ] }
//打包 npx webpack --config webpack.config.dll.js
這樣會(huì)在dist生成
然后在webpack.config.js里
const webpack= require("webpack") plugins: [ new webpack.DllReferencePlugin({ manifest:require("./dist/react.mainfest.json") }), new webpack.DllReferencePlugin({ manifest:require("./dist/jquery.mainfest.json") }) ]
這里它會(huì)從mainfest.json尋找name 然后根據(jù)它的標(biāo)識(shí)找到相應(yīng)內(nèi)容, dll.js就是打包出來后的動(dòng)態(tài)鏈接庫(kù)
然后在html模板文件里引入
如果你在main.jsimport React from "react",他會(huì)首先找動(dòng)態(tài)鏈接庫(kù), 找不到才會(huì)執(zhí)行打包
注:使用react需要配置好rule
{ test:/.js/, use:{ loader:"babel-loader", options:{ presets:[ "@babel/preset-env", "@babel/preset-react" ] } } },開啟多進(jìn)程打包
npm i happypack -D
如果一個(gè)項(xiàng)目代碼密集,讀寫操作頻繁,happypack 就能讓W(xué)ebpack把任務(wù)分解給多個(gè)子進(jìn)程去并發(fā)的執(zhí)行,子進(jìn)程處理完后再把結(jié)果發(fā)送給主進(jìn)程。
const HappyPack = require("happypack"); rules: [ { test: /.js$/, // 把對(duì) .js 文件的處理轉(zhuǎn)交給 id 為 babel 的 HappyPack 實(shí)例 use: ["happypack/loader?id=babel"], exclude: path.resolve(__dirname, "node_modules"), }, { test: /.css$/, // 把對(duì) .css 文件的處理轉(zhuǎn)交給 id 為 css 的 HappyPack 實(shí)例 use: ["happypack/loader?id=css"] } ] new Happypack({ //ID是標(biāo)識(shí)符的意思,ID用來代理當(dāng)前的happypack是用來處理一類特定的文件的 id: "js", use: [{ loader: "babel-loader", //options=query都是向插件傳遞參數(shù)的 options: { presets: [["@babel/preset-env", { modules: false }], "@babel/preset-react"], plugins: [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose": true }], ] } }] }), new Happypack({ //ID是標(biāo)識(shí)符的意思,ID用來代理當(dāng)前的happypack是用來處理一類特定的文件的 id: "css", use: [MiniCssExtractPlugin.loader, "css-loader", "postcss-loader"], threads: 4,//你要開啟多少個(gè)子進(jìn)程去處理這一類型的文件 verbose: true//是否要輸出詳細(xì)的日志 verbose })
注意:開啟進(jìn)程也需要時(shí)間, 如果一個(gè)項(xiàng)目并不是很復(fù)雜, 斟酌使用
不打包第三方庫(kù) 使用cdn引入module.exports = { //... externals: { jquery: "jQuery" } };
main.js 引入jquery 將不會(huì)打包 import jquery from "jQuery"
html模板內(nèi)引入jquery的cdn地址即可
盡量使用es6的模塊導(dǎo)入webpack的tree-shaking自己可以分析出哪些沒有使用到的代碼可以剔除,前提是es6模塊語法
scope-hosting可以提升作用域 比如 var a = 1; var b = a ; console.log(b) 會(huì)編譯成var b = 1; console.log(b)
做這種操作首先得是多頁(yè)面
entry:{ home:["./src/index.js"], login:["./src/login.js"] }, // 入口文件
//home.js import React from "react" import {render }from "react-dom" render(動(dòng)態(tài)鏈接庫(kù)
,window.root) //login.js import React from "react" import {render }from "react-dom" render(動(dòng)態(tài)鏈接庫(kù)
,window.root)
//webpack.config.js optimization:{ // 優(yōu)化 splitChunks:{ //分割代碼 cacheGroups:{ // 緩存組 common:{ // 公共的代碼 一般是自己寫的公共代碼 chunks:"initial", minSize:0, minChunks: 2, //最少被引用2次的模塊 name: "common" }, vendor:{ // 一般是第三方公共模塊 priority:1, // 因?yàn)閳?zhí)行是從上往下, 所以設(shè)置優(yōu)先級(jí)比上面高 不然上面抽離的話第三方模塊也被抽離了 test:/node_modules/ , //匹配node_modules下的公共代碼, chunks:"initial", minSize:0, minChunks: 2, //最少被引用2次的模塊 name: "vendor" } } } }懶加載
這里拿vue舉例
const Login = () => import(/* webpackChunkName: "login" */,"./login"); new VueRouter({ routes: [{ path: "/login", component: Login }] })
webpackChunkName雖然是注釋, 但是webpack能識(shí)別, 編譯后這個(gè)組件生產(chǎn)的名字就是login
可能會(huì)需要@babel/plugin-syntax-dynamic-import 才能識(shí)別
yarn add @babel/plugin-syntax-dynamic-import -D
具體配置看此文
熱更新devServer:{ // 告訴 DevServer 要開啟模塊熱替換模式 hot: true, }
在vue中只要這樣配置就可以了, vue自己幫我們做了配置
其他庫(kù)中:
import React from "react" import {render} from "react-dom" render(, document.getElementById("root")); if (module.hot) { // accept 函數(shù)的第一個(gè)參數(shù)指出當(dāng)前文件接受哪些子模塊的替換,這里表示只接受 ./AppComponent 這個(gè)子模塊 // 第2個(gè)參數(shù)用于在新的子模塊加載完畢后需要執(zhí)行的邏輯 module.hot.accept(["./App"], () => { // 新的 AppComponent 加載成功后重新執(zhí)行下組建渲染邏輯 let App=require("./App").default; render( , document.getElementById("root")); }); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102160.html
摘要:多頁(yè)面配置進(jìn)擊基礎(chǔ)篇一進(jìn)擊基礎(chǔ)篇二配置多頁(yè)面配置多頁(yè)面配置即是多入口需要寫成對(duì)象形式,注意數(shù)組形式會(huì)變成多入口單頁(yè)面,因?yàn)榇虬蟮臅?huì)合并成一個(gè)入口文件出口不能寫同一個(gè)文件用代替以上配置并不能多頁(yè)面,還需要個(gè)模板,并且指明各自的代碼塊去生成 多頁(yè)面配置 進(jìn)擊webpack 4 (基礎(chǔ)篇一) 進(jìn)擊webpack4 (基礎(chǔ)篇二:配置) ## 多頁(yè)面配置 ## 多頁(yè)面配置即是多入口 entr...
摘要:進(jìn)入入口起點(diǎn)后,會(huì)找出有哪些模塊和庫(kù)是入口起點(diǎn)直接和間接依賴的。用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。指定生產(chǎn)還是開發(fā)入口文件打包后的文件名這里需指定一個(gè)絕對(duì)路徑我們需要的模塊去解析路徑包含一系列的規(guī)則是一個(gè)具有屬性的對(duì)象。 前文:進(jìn)擊webpack 4 (基礎(chǔ)篇 一) webpack.config.js基礎(chǔ)配置 webpack 有4大概念 入口(entry) 輸出(output) load...
摘要:中在性能優(yōu)化所做的努力,也大抵圍繞著這兩個(gè)大方向展開。因此,將依賴模塊從業(yè)務(wù)代碼中分離是性能優(yōu)化重要的一環(huán)。大型庫(kù)是否可以通過定制功能的方式減少體積。這又違背了性能優(yōu)化的基礎(chǔ)。接下來可以抓住一些細(xì)節(jié)做更細(xì)的優(yōu)化。中,為默認(rèn)啟動(dòng)這一優(yōu)化。 前言:在現(xiàn)實(shí)項(xiàng)目中,我們可能很少需要從頭開始去配置一個(gè)webpack 項(xiàng)目,特別是webpack4.0發(fā)布以后,零配置啟動(dòng)一個(gè)項(xiàng)目成為一種標(biāo)配。正因?yàn)?..
摘要:在上一篇中我們談到過程序的執(zhí)行時(shí)間指令數(shù)要提升計(jì)算機(jī)的性能,可以從上面這三方面著手。在摩爾定律和并行計(jì)算之外,在整個(gè)計(jì)算機(jī)組成層面,還有這樣幾個(gè)原則性的性能提升方法。 showImg(https://ask.qcloudimg.com/http-save/1752328/uskvyzme4j.png); 在上一篇中,我們談到過 程序的CPU執(zhí)行時(shí)間 = 指令數(shù)×CPI×Clock Cy...
摘要:各種錯(cuò)誤處理錯(cuò)誤使用模塊發(fā)送請(qǐng)求時(shí)報(bào)錯(cuò)。不支持但靠后的元素層級(jí)更高支持四種偽類所有組件都支持但只有組件和組件支持。篇不支持值僅支持和如果定位元素超過容器邊界,在下,超出部分將不可見,原因在于端元素默認(rèn)值為,但目前暫不支持設(shè)置。 各種錯(cuò)誤處理 1.錯(cuò)誤:ReferenceError: global is not defined 使用stream模塊發(fā)送請(qǐng)求時(shí)報(bào)錯(cuò)。 showImg(htt...
閱讀 1226·2021-11-22 15:22
閱讀 3927·2021-10-19 13:13
閱讀 3701·2021-10-08 10:05
閱讀 3365·2021-09-26 10:20
閱讀 3081·2019-08-29 14:21
閱讀 2268·2019-08-27 10:55
閱讀 1925·2019-08-26 10:31
閱讀 2647·2019-08-23 16:47