Webpack進階(三)

懶加載 lazy loading

  • 用到的時候才加載
  • vue 首屏不加載
  • index.js
const oBtn = document.getElementById('j-button')
oBtn.onclick = async function () {const div = await createElement()document.body.appendChild(div)
}
async function createElement() {const { default: _ } = await import(/* webpackChunkName: "my-loadsh" */ 'lodash')const res = _.join([1, 2, 3], '*')const div = document.createElement('div')div.innerText = resreturn div
}
  • 支持async await語法
  • webpack.base.js配置options
// cnpm install --save-dev @babel/plugin-transform-runtime
{test: /\.js$/,use: {loader: 'babel-loader',options: {plugins: ["@babel/plugin-transform-runtime"]}},exclude: path.resolve(__dirname, 'node_modules')
},
  • 點擊按鈕前
    在這里插入圖片描述
  • 點擊按鈕
    在這里插入圖片描述

module chunk bundle

  • 多個入口 → 生成多個chunk
  • 異步引入import 生成chunk
  • splitChunk也能生成chunk
  • bundle:dist中的文件
    在這里插入圖片描述

如何找到webpack對應的loader版本

在這里插入圖片描述

  • 安裝后打包css文件保存,版本不匹配(不要去百度,網上搜的都告訴你是sass-loader版本的問題,可我都沒有使用.scss文件啊)
  • 回退到一年前的版本npm
  • package.json
"devDependencies": {"@babel/cli": "^7.14.8","@babel/core": "^7.15.0","@babel/plugin-transform-runtime": "^7.15.0","@babel/preset-env": "^7.15.0","babel-loader": "^8.2.2","clean-webpack-plugin": "^4.0.0-alpha.0","core-js": "^3.8.3","css-loader": "^3.5.0","html-webpack-plugin": "~3.2.0","lodash": "^4.17.21","style-loader": "^1.1.4","webpack": "~4.41.5","webpack-cli": "~3.3.10","webpack-dev-server": "~3.10.1","webpack-merge": "^5.8.0"}

CSS代碼分割

css in JS

  • style-loader會將css代碼放入style標簽
  • index.css
body {background: orange;
}
  • index.js
import './index.css';
...
  • 編譯后沒有.css文件,而是在main.js中
    在這里插入圖片描述

使用MiniCssExtractPlugin分離css和JS

https://webpack.docschina.org/plugins/mini-css-extract-plugin/

  • 安裝"mini-css-extract-plugin"
  • 在生產環境使用
  • webpack.prod.js
  • 使用CssMinimizerPlugin壓縮css
const { merge } = require('webpack-merge')
// 公共配置
const baseConfig = require('./webpack.base')
// 生產環境 js css分離
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 壓縮
const CssMinimizerPlugin = require("CssMinimizerPlugin")
// 生產環境特有的配置
const prodConfig = {mode: 'production',devtool: 'cheap-module-source-map',// CSS JS分離plugins: [new MiniCssExtractPlugin()],optimization: {// 壓縮minimize: true,minimizer: [new CssMinimizerPlugin()],// 提取所有的 CSS 到一個文件中 會產生map映射文件splitChunks: {cacheGroups: {styles: {name: "styles",test: /\.css$/,chunks: "all",enforce: true,},},},},module: {rules: [{test: /\.css$/i,// CSS JS分離use: [MiniCssExtractPlugin.loader, "css-loader"],},],},
};module.exports = merge(baseConfig, prodConfig)
  • package.json
// 忽略對css文件的tree shaking
"sideEffects": ["*.css"],

csdn效果

  • 提取所有的 CSS 到一個文件中
  • 基于入口提取 CSS

瀏覽器緩存(生產環境)

  • 瀏覽器開啟緩存后:不會拿最新的index.js文件
  • 解決:使用hash
  • 根據文件內容生成hash值
  • webpack.prod.js
const path = require("path");
const { merge } = require('webpack-merge')
// 公共配置
const baseConfig = require('./webpack.base')
// 生產環境特有的配置
const prodConfig = {mode: 'production',devtool: 'none',output: {// 文件內容帶哈希值filename: '[contenthash].bundle.js',path: path.resolve(__dirname, "../dist"),},
};module.exports = merge(baseConfig, prodConfig)

在這里插入圖片描述

  • 限制位數filename: '[name].[contenthash:8].js',
    在這里插入圖片描述

Shimming

  • 比如第三方庫使用了Jquery,但又沒有引入,也不便于修改第三方庫的源代碼,就需要使用。官方案例如下:
    https://webpack.docschina.org/guides/shimming/#root

webpack5

  • 版本查詢
  • npm info webpack version(當前版本)
  • npm info webpack versions(歷史版本)
    在這里插入圖片描述

webpack5

  • 對被不同文件引入的string.js,在webpack中配置
  • string.js會被分割,打包到common.js
optimization:{splitChunks:{chunks: 'all',minSize: 0,cacheGroups: {vendors:{// 對第三方庫的打包 如lodashtest: /[\\/]node_modules[\\/]/,priority: -10,		filename: 'vnedors.js',minChunks: 1}			default:{filename: 'common.js',priority: -20,	minChunks: 2}}}
}
  • webpack打包后會自動生成一些箭頭函數,可以這樣配置來關閉
output:{environment:{arrowFunction: false}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

P2634 [國家集訓隊]聰聰可可

鏈接:https://www.luogu.org/problemnew/show/P2634 題目描述 聰聰和可可是兄弟倆,他們倆經常為了一些瑣事打起來,例如家中只剩下最后一根冰棍而兩人都想吃、兩個人都想玩兒電腦(可是他們家只有一臺電腦)……遇到這種問…

算法 --- 快慢指針判斷鏈表是否有環

解題思路: 分別設置2個指針(s,q)指向鏈表的頭部,s每次指向下面一個(s s.next),q每次指向下面2個(q q.next.next). 如果存在環,q總會在某一時刻追上s /*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//**…

APP拉起小程序

結論:APP可以喚起小程序,前提是APP開發者在微信開放平臺帳號下申請移動應用,通過審核并關聯小程序,參考如下: 準備工作: APP開發者認證微信開放平臺 https://kf.qq.com/faq/170824URbmau170824r2uY7j.html APP開發者…

node --- 使用nrm改變npm的源

說明: 1.nrm只是單純的提供了幾個常用的下載包的URL地址,方便我們再使用npm裝包是 很方便的進行切換. 2.nrm提供的cnpm 和通過 cnpm裝包是2個不同的東西(使用cnpm install必須先安裝cnpm -> npm install -g cnpm) 安裝nrm: // linux $ [sudo] npm install --global nrm// w…

MySQL教程(三)—— MySQL的安裝與配置

1 安裝MySQL 打開附件中的文件(分別對應電腦系統為32/64位)。點next。 三個選項,分別對應典型安裝、自定義安裝和完全安裝,在此選擇典型安裝(初學者)。 點install。 廣告,忽略它。 安裝完成…

算法面經之百度

一、百度 前言:本來不打算寫百度面筋的,因為二面表現自我感覺實在太差了,像是被生活抽了一記耳光,不愿再去揭傷疤,奈何,半個月過去了,昨天又被百度從備胎池拉出來涮了一遍,涮的時候也…

flask-session總結

一、session session和cookie的原理和區別: cookie是保存在瀏覽器上的鍵值對 session是存在服務端的鍵值對(服務端的session就是一個大字典,字典中是隨機字符串)(session與request原理相同)&am…

c++ --- 字符串中的標點符號

題外話: 最近看node,發現node中好多強大的功能都設計到C,為了加深對node的理解,開始簡單的學習一下C語法 ispunct: 統計string對象中標點符號的個數 #include <iostream> using namespace std; int main () {string s ("Hello World!");decltype(s.size()) p…

Hadoop(5)-Hive

在Hadoop的存儲處理方面提供了兩種不同的機制&#xff0c;一種是之前介紹過的Hbase&#xff0c;另外一種就是Hive&#xff0c;有關于Hbase&#xff0c;它是一種nosql數據庫的一種&#xff0c;是一種數據庫&#xff0c;基于分布式的列式存儲&#xff0c;適合海量數據的操作&…

高精——模板

紫書&#xff1a; #include <iostream> #include <string> #include <cstring> #include <cstdio> using namespace std; const int maxn 1000; struct bign{ int d[maxn], len; void clean() { while(len > 1 && !d[len-1]) …

認識及實現MVC

gitee M&#xff1a;Model 數據模型&#xff08;模型層&#xff09;→ 操作數據庫&#xff08;對數據進行增刪改查&#xff09; V&#xff1a;View視圖層 → 顯示視圖或視圖模板 C&#xff1a;Controller 控制器層 → 邏輯層 數據和視圖關聯掛載和基本的邏輯操作 API層 前端請…

算法 --- 翻轉二叉樹

解(C): 1.二叉樹判空 if(root 0) 或 if(root nullptr); 2.二叉樹的左子樹: root->left . 3.使用遞歸,將當前根節點的左右指針指向互換左向右子樹(此時右子樹也進行了翻轉) // C /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode…

float 常見用法與問題--摘抄

float 屬性絕對是眾多切圖仔用的最多的 CSS 屬性之一&#xff0c;它的用法很簡單&#xff0c;常用值就 left、right、none 三個&#xff0c;但是它的特性你真的弄懂了嗎&#xff1f; 我會在這里介紹我對 float 的認識與使用&#xff0c;以及使用過程中遇到的問題。 對 float 的…

javascipt -- find方法和findIndex方法的實現

find: 根據傳入的條件函數,返回符合條件的第一項 var arr [{id: 1, name: zs, age: 18},{id: 2, name: zs, age: 17},{id: 3, name: ls, age: 16},{id: 4, name: ls, age: 15}]Array.prototype._find_ function(cb){for(var i0; i< this.length; i){if(cb(this[i],i)){ret…

bzoj 2179 FFT快速傅立葉 FFT

題面 題目傳送門 解法 題如其名…… 不妨將多項式的\(x^i\)變成\(10^i\)&#xff0c;然后就是一個比較簡單的FFT了 md讀進來的是一個字符串&#xff0c;并且要倒序 最后注意進位問題 時間復雜度&#xff1a;\(O(n\ log\ n)\) 代碼 #include <bits/stdc.h> #define N 1 &l…

【探討】javascript事件機制底層實現原理

前言 又到了扯淡時間了&#xff0c;我最近在思考javascript事件機制底層的實現&#xff0c;但是暫時沒有勇氣去看chrome源碼&#xff0c;所以今天我來猜測一把 我們今天來猜一猜&#xff0c;探討探討&#xff0c;javascript底層事件機制是如何實現的 博客里面關于事件綁定與執行…

node --- 在node中使用mongoosemongoDB的安裝

*首先確保,你的電腦安裝了mongodb,網址: mongodb官網 *使用npm安裝 mongoose: mongoose官網 ps:mongoose是Node中操作mongoDB的第三方插件.用于提高數據庫操作效率(相當于在mongoDB上封裝了一次,暴露出更友好的API) MongoDB的安裝 1.下載地址 2.下載好了后,傻瓜式的安裝(我的…

websocket demo

git node.js創建websocket 的服務 Nodejs Websocket包 ws.createServer([options], [callback]) The callback is a function which is automatically added to the “connection” event. 前端代碼 1. 創建實例、打開連接 this.websocket new WebSocket(ws://127.0.0.1:80…

shell常用命令總結總結

打rpm包&#xff1a; rpmbuild -bb SPECS/smplayer.spec --define "_topdir pwd" 安裝rpm包&#xff1a; rpm -ivh [rpm包文件] 如果安裝不上 rpm -ivh [rpm包文件] --force #強制安裝 打包的時候可能需要一些依賴&#xff1a; dnf install 【依賴文件名】 sed -i常用…

Filter

一、簡介 Filter也稱之為過濾器&#xff0c;它是Servlet技術中最激動人心的技術&#xff0c;WEB開發人員通過Filter技術&#xff0c;對web服務器管理的所有web資源&#xff1a;例如Jsp&#xff0c;Servlet&#xff0c;靜態圖片文件或靜態html文件進行攔截&#xff0c;從而實現一…