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