精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

初學(xué)者應(yīng)該看的 Webpack 完整指南(2020)

開發(fā) 前端
如今,CLI工具(如create-react-app或Vue -cli)已經(jīng)為我們抽象了大部分配置,并提供了合理的默認(rèn)設(shè)置。

[[335456]]

我們應(yīng)該學(xué)習(xí) webpack 嗎 ?

如今,CLI工具(如create-react-app或Vue -cli)已經(jīng)為我們抽象了大部分配置,并提供了合理的默認(rèn)設(shè)置。

即使那樣,了解幕后工作原理還是有好處的,因?yàn)槲覀冞t早需要對(duì)默認(rèn)值進(jìn)行一些調(diào)整。

在本文中中,我們會(huì)知道 webpack可以做什么,以及如何配置它以滿足我們的日常需求。

什么是 webpack?

作為前端開發(fā)人員,我們應(yīng)該熟悉 module 概念。你可能聽說過 AMD模塊,UMD,Common JS還有ES模塊。

webpack是一個(gè)模塊綁定器,它對(duì)模塊有一個(gè)更廣泛的定義,對(duì)于webpack來說,模塊是:

  • Common JS modules
  • AMD modules
  • CSS import
  • Images url
  • ES modules

webpack 還可以從這些模塊中獲取依賴關(guān)系。

webpack 的最終目標(biāo)是將所有這些不同的源和模塊類型統(tǒng)一起來,從而將所有內(nèi)容導(dǎo)入JavaScript代碼,并最生成可以運(yùn)行的代碼。

entry

Webpack的 **entry(入口點(diǎn))**是收集前端項(xiàng)目的所有依賴項(xiàng)的起點(diǎn)。實(shí)際上,這是一個(gè)簡(jiǎn)單的 JavaScript 文件。

這些依賴關(guān)系形成一個(gè)依賴關(guān)系圖。

Webpack 的默認(rèn)入口點(diǎn)(從版本4開始)是src/index.js,它是可配置的。webpack 可以有多個(gè)入口點(diǎn)。

Output

output是生成的JavaScript和靜態(tài)文件的地方。

Loaders

Loaders 是第三方擴(kuò)展程序,可幫助webpack處理各種文件擴(kuò)展名。例如,CSS,圖像或txt文件。

Loaders的目標(biāo)是在模塊中轉(zhuǎn)換文件(JavaScript以外的文件)。文件成為模塊后,webpack可以將其用作項(xiàng)目中的依賴項(xiàng)。

Plugins

插件是第三方擴(kuò)展,可以更改webpack的工作方式。例如,有一些用于提取HTML,CSS或設(shè)置環(huán)境變量的插件。

Mode

webpack 有兩種操作模式:開發(fā)(development)和生產(chǎn)(production)。它們之間的主要區(qū)別是生產(chǎn)模式自動(dòng)生成一些優(yōu)化后的代碼。

Code splitting

代碼拆分或延遲加載是一種避免生成較大包的優(yōu)化技術(shù)。

通過代碼拆分,開發(fā)人員可以決定僅在響應(yīng)某些用戶交互時(shí)加載整個(gè)JavaScript塊,比如單擊或路由更改(或其他條件)。

被拆分的一段代碼稱為 chunk。

Webpack入門

開始使用webpack時(shí),先創(chuàng)建一個(gè)新文件夾,然后進(jìn)入該文件中,初始化一個(gè)NPM項(xiàng)目,如下所示:

  1. mkdir webpack-tutorial && cd $_ 
  2.  
  3. npm init -y 

接著安裝 webpack,webpack-cli和 webpack-dev-server:

  1. npm i webpack webpack-cli webpack-dev-server --save-dev 

要運(yùn)行 webpack,只需要在 package.json 配置如下命令即可:

  1. "scripts": { 
  2.    "dev""webpack --mode development" 
  3.  }, 

通過這個(gè)腳本,我們指導(dǎo)webpack在開發(fā)模式下工作,方便在本地工作。

Webpack 的第一步

在開發(fā)模式下運(yùn)行 webpack:

  1. npm run dev 

運(yùn)行完后會(huì)看到如下錯(cuò)誤:

  1. ERROR in Entry module not found: Error: Can't resolve './src' 

webpack 在這里尋找默認(rèn)入口點(diǎn)src/index.js,所以我們需要手動(dòng)創(chuàng)建一下,并輸入一些內(nèi)容:

  1. mkdir src 
  2.  
  3. echo 'console.log("Hello webpack!")' > src/index.js 

現(xiàn)在再次運(yùn)行npm run dev,錯(cuò)誤就沒有了。運(yùn)行的結(jié)果生成了一個(gè)名為dist/的新文件夾,其中包含一個(gè)名為main.js的 JS 文件:

  1. dist 
  2. └── main.js 

這是我們的第一個(gè)webpack包,也稱為output。

配置 Webpack

對(duì)于簡(jiǎn)單的任務(wù),webpack無需配置即可工作,但是很快我們就會(huì)遇到問題,一些文件如果沒有指定的 loader 是沒法打包的。所以,我們需要對(duì) webpack進(jìn)行配置,對(duì)于 webpack 的配置是在 webpack.config.js 進(jìn)行的,所以我們需要?jiǎng)?chuàng)建該文件:

  1. touch webpack.config.js 

Webpack 用 JavaScript 編寫,并在無頭 JS 環(huán)境(例如Node.js)上運(yùn)行。在此文件中,至少需要一個(gè)module.exports,這是的 Common JS 導(dǎo)出方式:

  1. module.exports = { 
  2.   // 
  3. }; 

在webpack.config.js中,我們可以通過添加或修改來改變webpack的行為方式

  • entry point
  • output
  • loaders
  • plugins
  • code splitting

例如,要更改入口路徑,我們可以這樣做

  1. const path = require("path"); 
  2.  
  3. module.exports = { 
  4.   entry: { index: path.resolve(__dirname, "source""index.js") } 
  5. }; 

現(xiàn)在,webpack 將在source/index.js中查找要加載的第一個(gè)文件。要更改包的輸出路徑,我們可以這樣做:

  1. const path = require("path"); 
  2.  
  3. module.exports = { 
  4.   output: { 
  5.     path: path.resolve(__dirname, "build"
  6.   } 

這樣,webpack將把最終生成包放在build中,而不是dist.(為了簡(jiǎn)單起見,在本文中,我們使用默認(rèn)配置)。

打包 HTML

沒有HTML頁面的Web應(yīng)用程序幾乎沒有用。要在webpack中使用 HTML,我們需要安裝一個(gè)插件html-webpack-plugin:

  1. npm i html-webpack-plugin --save-dev 

一旦插件安裝好,我們就可以對(duì)其進(jìn)行配置:

  1. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  2. const path = require("path"); 
  3.  
  4. module.exports = { 
  5.   plugins: [ 
  6.     new HtmlWebpackPlugin({ 
  7.       template: path.resolve(__dirname, "src""index.html"
  8.     }) 
  9.   ] 
  10. }; 

這里的意思是讓 webpack,從 src/index.html 加載 HTML 模板。

html-webpack-plugin的最終目標(biāo)有兩個(gè):

  • 加載 html 文件
  • 它將bundle注入到同一個(gè)文件中

接著,我們需要在 src/index.html 中創(chuàng)建一個(gè)簡(jiǎn)單的 HTML 文件:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Webpack tutorial</title> 
  6. </head> 
  7. <body> 
  8.  
  9. </body> 
  10. </html> 

 

稍后,我們會(huì)運(yùn)行這個(gè)程序。

webpack development server

在本文第一部分中,我們安裝了webpack-dev-server。如果你忘記安裝了,現(xiàn)在可以運(yùn)行下面命令安裝一下:

  1. npm i webpack-dev-server --save-dev 

webpack-dev-server 可以讓開發(fā)更方便,不需要改動(dòng)了文件就去手動(dòng)刷新文件。配置完成后,我們可以啟動(dòng)本地服務(wù)器來提供文件。

要配置webpack-dev-server,請(qǐng)打開package.json并添加一個(gè) “start” 命令:

  1. "scripts": { 
  2.   "dev""webpack --mode development"
  3.   "start""webpack-dev-server --mode development --open"
  4. }, 

有了 start 命令,我們來跑一下:

  1. npm start 

運(yùn)行后,默認(rèn)瀏覽器應(yīng)打開。在瀏覽器的控制臺(tái)中,還應(yīng)該看到一個(gè) script 標(biāo)簽,引入的是我們的 main.js。

 

使用 webpack loader

Loader是第三方擴(kuò)展程序,可幫助webpack處理各種文件擴(kuò)展名。例如,有用于 CSS,圖像或 txt 文件的加載程序。

下面是一些 loader 配置介紹:

  1. module.exports = { 
  2.   module: { 
  3.     rules: [ 
  4.       { 
  5.         test: /\.filename$/, 
  6.         use: ["loader-b""loader-a"
  7.       } 
  8.     ] 
  9.   }, 
  10.   // 
  11. }; 

相關(guān)配置以module 關(guān)鍵字開始。在module內(nèi),我們?cè)趓ules內(nèi)配置每個(gè)加載程序組或單個(gè)加載程序。

對(duì)于我們想要作為模塊處理的每個(gè)文件,我們用test和use配置一個(gè)對(duì)象

  1.     test: /\.filename$/, 
  2.     use: ["loader-b""loader-a"

test 告訴 webpack “嘿,將此文件名視為一個(gè)模塊”。use 定義將哪些 loaders 應(yīng)用于些打包的文件。

打包 CSS

要 在webpack 中打包CSS,我們需要至少安裝兩個(gè) loader。Loader 對(duì)于幫助 webpack 了解如何處理.css文件是必不可少的。

要在 webpack 中測(cè)試 CSS,我們需要在 src 下創(chuàng)建一個(gè)style.css文件:

  1. h1 { 
  2.     color: orange; 

另外在 src/index.html 添加 h1 標(biāo)簽

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Webpack tutorial</title> 
  6. </head> 
  7. <body> 
  8. <h1>Hello webpack!</h1> 
  9. </body> 
  10. </html> 

 

最后,在src/index.js 中加載 CSS:

在測(cè)試之前,我們需要安裝兩個(gè) loader:

  • css-loader:解析 css 代碼中的 url、@import語法像import和require一樣去處理css里面引入的模塊
  • style-loader:幫我們直接將css-loader解析后的內(nèi)容掛載到html頁面當(dāng)中

安裝 loader:

  1. npm i css-loader style-loader --save-dev 

然后在webpack.config.js中配置它們

  1. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  2. const path = require("path"); 
  3.  
  4. module.exports = { 
  5.   module: { 
  6.     rules: [ 
  7.       { 
  8.         test: /\.css$/, 
  9.         use: ["style-loader""css-loader"
  10.       } 
  11.     ] 
  12.   }, 
  13.   plugins: [ 
  14.     new HtmlWebpackPlugin({ 
  15.       template: path.resolve(__dirname, "src""index.html"
  16.     }) 
  17.   ] 
  18. }; 

現(xiàn)在,如果你運(yùn)行npm start,會(huì)看到樣式表加載在HTML的頭部:

 

一旦CSS Loader 就位,我們還可以使用MiniCssExtractPlugin提取CSS文件

Webpack Loader 順序很重要!

在webpack中,Loader 在配置中出現(xiàn)的順序非常重要。以下配置無效:

  1. // 
  2.  
  3. module.exports = { 
  4.   module: { 
  5.     rules: [ 
  6.       { 
  7.         test: /\.css$/, 
  8.         use: ["css-loader""style-loader"
  9.       } 
  10.     ] 
  11.   }, 
  12.   // 
  13. }; 

此處,“style-loader”出現(xiàn)在 “css-loader” 之前。但是style-loader用于在頁面中注入樣式,而不是用于加載實(shí)際的CSS文件。

相反,以下配置有效:

  1. module.exports = { 
  2.   module: { 
  3.     rules: [ 
  4.       { 
  5.         test: /\.css$/, 
  6.         use: ["style-loader""css-loader"
  7.       } 
  8.     ] 
  9.   }, 
  10.   // 
  11. }; 

webpack loaders 是從右到左執(zhí)行的。

打包 sass

要在 webpack 中測(cè)試sass,同樣,我們需要在 src 目錄下創(chuàng)建一個(gè) style.scss 文件:

  1. @import url("https://fonts.googleapis.com/css?family=Karla:weight@400;700&display=swap"); 
  2.  
  3. $font: "Karla", sans-serif; 
  4. $primary-color: #3e6f9e; 
  5.  
  6. body { 
  7.   font-family: $font; 
  8.   color: $primary-color; 

另外,在src/index.html中添加一些 Dom 元素:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Webpack tutorial</title> 
  6. </head> 
  7. <body> 
  8.   <h1>Hello webpack!</h1> 
  9.   <p>Hello sass!</p> 
  10. </body> 
  11. </html> 

 

最后,將 sass 文件加載到src/index.js中:

  1. import "./style.scss"
  2. console.log("Hello webpack!"); 

在測(cè)試之前,我們需要安裝幾個(gè) loader:

  • sass-loader:加載 SASS / SCSS 文件并將其編譯為 CSS
  • css-loader:解析 css 代碼中的 url、@import語法像import和require一樣去處理css里面引入的模塊
  • style-loader:幫我們直接將css-loader解析后的內(nèi)容掛載到html頁面當(dāng)中

安裝 loader:

  1. npm i css-loader style-loader sass-loader sass --save-dev 

然后在webpack.config.js中配置它們:

  1. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  2. const path = require("path"); 
  3.  
  4. module.exports = { 
  5.   module: { 
  6.     rules: [ 
  7.       { 
  8.         test: /\.scss$/, 
  9.         use: ["style-loader""css-loader""sass-loader"
  10.       } 
  11.     ] 
  12.   }, 
  13.   plugins: [ 
  14.     new HtmlWebpackPlugin({ 
  15.       template: path.resolve(__dirname, "src""index.html"
  16.     }) 
  17.   ] 
  18. }; 

注意loader的出現(xiàn)順序:首先是sass-loader,然后是css-loader,最后是style-loader。

現(xiàn)在,運(yùn)行npm start,你應(yīng)該會(huì)在HTML的頭部看到加載的樣式表:

 

打包現(xiàn)代 JavaScrip

webpack 本身并不知道如何轉(zhuǎn)換JavaScript代碼。 該任務(wù)已外包給babel的第三方 loader,特別是babel-loader。

babel是一個(gè)JavaScript編譯器和“編譯器”。babel 可以將現(xiàn)代JS(es6, es7...)轉(zhuǎn)換為可以在(幾乎)任何瀏覽器中運(yùn)行的兼容代碼。

同樣,要使用它,我們需要安裝一些 Loader:

  • babel-core :把 js 代碼分析成 ast ,方便各個(gè)插件分析語法進(jìn)行相應(yīng)的處理
  • babel-preset-env:將現(xiàn)代 JS 編譯為ES5
  • **babel-loader **:用于 webpack

引入依賴關(guān)系

  1. npm i @babel/core babel-loader @babel/preset-env --save-dev 

接著,創(chuàng)建一個(gè)新文件babel.config.json配置babel,內(nèi)容如下:

  1.   "presets": [ 
  2.     "@babel/preset-env" 
  3.   ] 

最后在配置一下 webpack :

  1. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  2. const path = require("path"); 
  3.  
  4. module.exports = { 
  5.   module: { 
  6.     rules: [ 
  7.       { 
  8.         test: /\.scss$/, 
  9.         use: ["style-loader""css-loader""sass-loader"
  10.       }, 
  11.       { 
  12.         test: /\.js$/, 
  13.         exclude: /node_modules/, 
  14.         use: ["babel-loader"
  15.       } 
  16.     ] 
  17.   }, 
  18.   plugins: [ 
  19.     new HtmlWebpackPlugin({ 
  20.       template: path.resolve(__dirname, "src""index.html"
  21.     }) 
  22.   ] 
  23. }; 

要測(cè)試轉(zhuǎn)換,可以在 src/index.js中編寫一些現(xiàn)代語法:

  1. import "./style.scss"
  2. console.log("Hello webpack!"); 
  3.  
  4. const fancyFunc = () => { 
  5.   return [1, 2]; 
  6. }; 
  7.  
  8. const [a, b] = fancyFunc(); 

現(xiàn)在運(yùn)行npm run dev來查看dist中轉(zhuǎn)換后的代碼。打開 dist/main.js并搜索“fancyFunc”:

  1. \n\nvar fancyFunc = function fancyFunc() {\n  return [1, 2];\n};\n\nvar _fancyFunc = fancyFunc(),\n    _fancyFunc2 = _slicedToArray(_fancyFunc, 2),\n    a = _fancyFunc2[0],\n    b = _fancyFunc2[1];\n\n//# sourceURL=webpack:///./src/index.js?" 

沒有babel,代碼將不會(huì)被轉(zhuǎn)譯:

  1. \n\nconsole.log(\"Hello webpack!\");\n\nconst fancyFunc = () => {\n  return [1, 2];\n};\n\nconst [a, b] = fancyFunc();\n\n\n//# sourceURL=webpack:///./src/index.js?");  

**注意:**即使沒有babel,webpack也可以正常工作。僅在執(zhí)行 ES5 代碼時(shí)才需要進(jìn)行代碼轉(zhuǎn)換過程。

在 Webpack 中使用 JS 的模塊

webpack 將整個(gè)文件視為模塊。但是,請(qǐng)不要忘記它的主要目的:加載ES模塊。

ECMAScript模塊(簡(jiǎn)稱ES模塊)是一種JavaScript代碼重用的機(jī)制,于2015年推出,一經(jīng)推出就受到前端開發(fā)者的喜愛。在2015之年,JavaScript 還沒有一個(gè)代碼重用的標(biāo)準(zhǔn)機(jī)制。多年來,人們對(duì)這方面的規(guī)范進(jìn)行了很多嘗試,導(dǎo)致現(xiàn)在有多種模塊化的方式。

你可能聽說過AMD模塊,UMD,或CommonJS,這些沒有孰優(yōu)孰劣。最后,在ECMAScript 2015中,ES 模塊出現(xiàn)了。

我們現(xiàn)在有了一個(gè)“正式的”模塊系統(tǒng)。

要在 webpack 使用 ES module ,首先創(chuàng)建 src/common/usersAPI.js 文件:

  1. const ENDPOINT = "https://jsonplaceholder.typicode.com/users/"
  2.  
  3. export function getUsers() { 
  4.   return fetch(ENDPOINT) 
  5.     .then(response => { 
  6.       if (!response.ok) throw Error(response.statusText); 
  7.       return response.json(); 
  8.     }) 
  9.     .then(json => json); 

在 src/index.js中,引入上面的模塊:

  1. import { getUsers } from "./common/usersAPI"
  2. import "./style.scss"
  3. console.log("Hello webpack!"); 
  4.  
  5. getUsers().then(json => console.log(json)); 

生產(chǎn)方式

如前所述,webpack有兩種操作模式:開發(fā)(development )和(production)。到目前為止,我們僅在開發(fā)模式下工作。

在開發(fā)模式中,為了便于代碼調(diào)試方便我們快速定位錯(cuò)誤,不會(huì)壓縮混淆源代碼。相反,在生產(chǎn)模式下,webpac k進(jìn)行了許多優(yōu)化:

  • 使用 TerserWebpackPlugin 進(jìn)行縮小以減小 bundle 的大小
  • 使用ModuleConcatenationPlugin提升作用域

在生產(chǎn)模式下配 置webpack,請(qǐng)打開 package.json 并添加一個(gè)“ build” 命令:

現(xiàn)在運(yùn)行 npm run build,webpack 會(huì)生成一個(gè)壓縮的包。

Code splitting

**代碼拆分(Code splitting)**是指針對(duì)以下方面的優(yōu)化技術(shù):

  • 避免出現(xiàn)一個(gè)很大的 bundle
  • 避免重復(fù)的依賴關(guān)系

webpack 社區(qū)考慮到應(yīng)用程序的初始 bundle 的最大大小有一個(gè)限制:200KB。

在 webpack 中有三種激活 code splitting 的主要方法:

  • 有多個(gè)入口點(diǎn)
  • 使用 optimization.splitChunks 選項(xiàng)
  • 動(dòng)態(tài)導(dǎo)入

第一種基于多個(gè)入口點(diǎn)的技術(shù)適用于較小的項(xiàng)目,但是從長(zhǎng)遠(yuǎn)來看它是不可擴(kuò)展的。這里我們只關(guān)注第二和第三種方式。

Code splitting 與 optimization.splitChunks

考慮一個(gè)使用Moment.js 的 JS 應(yīng)用程序,Moment.js是流行的時(shí)間和日期JS庫。

在項(xiàng)目文件夾中安裝該庫:

  1. npm i moment 

現(xiàn)在清除src/index.js的內(nèi)容,并引入 moment 庫:

  1. import moment from "moment"

運(yùn)行 npm run build 并查看控制的輸出內(nèi)容:

  1. main.js    350 KiB       0  [emitted]  [big]  main 

整個(gè) moment 庫都綁定到了 main.js 中這樣是不好的。借助optimization.splitChunks,我們可以從主包中移出moment.js。

要使用它,需要在 webpack.config.js 添加 optimization 選項(xiàng):

  1. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  2. const path = require("path"); 
  3.  
  4. module.exports = { 
  5.   module: { 
  6.   // ... 
  7.   }, 
  8.   optimization: { 
  9.     splitChunks: { chunks: "all" } 
  10.   }, 
  11.   // ... 
  12. }; 

運(yùn)行npm run build 并查看運(yùn)行結(jié)果:

  1. main.js   5.05 KiB       0  [emitted]         main 
  2. main.js    346 KiB       1  [emitted]  [big]  vendors~main 

現(xiàn)在,我們有了一個(gè)帶有moment.js 的vendors〜main.js,而主入口點(diǎn)的大小更合理。

注意:即使進(jìn)行代碼拆分,moment.js仍然是一個(gè)體積較大的庫。有更好的選擇,如使用luxon或date-fns。

## Code splitting 與 動(dòng)態(tài)導(dǎo)入

Code splitting的一種更強(qiáng)大的技術(shù)使用動(dòng)態(tài)導(dǎo)入來有條件地加載代碼。在ECMAScript 2020中提供此功能之前,webpack 提供了動(dòng)態(tài)導(dǎo)入。

這種方法在 Vue 和 React 之類的現(xiàn)代前端庫中得到了廣泛使用(React有其自己的方式,但是概念是相同的)。

Code splitting 可用于:

  • 模塊級(jí)別
  • 路由級(jí)別

例如,你可以有條件地加載一些 JavaScript 模塊,以響應(yīng)用戶的交互(例如單擊或鼠標(biāo)移動(dòng))?;蛘?,可以在響應(yīng)路由更改時(shí)加載代碼的相關(guān)部分。

要使用動(dòng)態(tài)導(dǎo)入,我們先清除src/index.html,并寫入下面的內(nèi)容:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5.     <title>Dynamic imports</title> 
  6. </head> 
  7. <body> 
  8. <button id="btn">Load!</button> 
  9. </body> 
  10. </html> 

在 src/common/usersAPI.js中:

  1. const ENDPOINT = "https://jsonplaceholder.typicode.com/users/"
  2.  
  3. export function getUsers() { 
  4.   return fetch(ENDPOINT) 
  5.     .then(response => { 
  6.       if (!response.ok) throw Error(response.statusText); 
  7.       return response.json(); 
  8.     }) 
  9.     .then(json => json); 

在 src/index.js 中

  1. const btn = document.getElementById("btn"); 
  2.  
  3. btn.addEventListener("click", () => { 
  4.   // 
  5. }); 

如果運(yùn)行npm run start查看并單擊界面中的按鈕,什么也不會(huì)發(fā)生。

現(xiàn)在想象一下,我們想在某人單擊按鈕后加載用戶列表。“原生”的方法可以使用靜態(tài)導(dǎo)入從src/common /usersAPI.js加載函數(shù):

  1. import { getUsers } from "./common/usersAPI"
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", () => { 
  6.   getUsers().then(json => console.log(json)); 
  7. }); 

問題在于ES模塊是靜態(tài)的,這意味著我們無法在運(yùn)行時(shí)更改導(dǎo)入的內(nèi)容。

通過動(dòng)態(tài)導(dǎo)入,我們可以選擇何時(shí)加載代碼

  1. const getUserModule = () => import("./common/usersAPI"); 
  2.  
  3. const btn = document.getElementById("btn"); 
  4.  
  5. btn.addEventListener("click", () => { 
  6.   getUserModule().then(({ getUsers }) => { 
  7.     getUsers().then(json => console.log(json)); 
  8.   }); 
  9. }); 

這里我們創(chuàng)建一個(gè)函數(shù)來動(dòng)態(tài)加載模塊

  1. const getUserModule = () => import("./common/usersAPI"); 

現(xiàn)在,當(dāng)你第一次使用npm run start加載頁面時(shí),會(huì)看到控制臺(tái)中已加載 js 包:

 

現(xiàn)在,僅在單擊按鈕時(shí)才加載/common/usersAPI:

 

對(duì)應(yīng)的 chunk 是 0.js

通過在導(dǎo)入路徑前面加上魔法注釋/ * webpackChunkName:“ name_here” * /,可以更改塊名稱:

  1. const getUserModule = () => 
  2.   import(/* webpackChunkName: "usersAPI" */ "./common/usersAPI"); 
  3.  
  4. const btn = document.getElementById("btn"); 
  5.  
  6. btn.addEventListener("click", () => { 
  7.   getUserModule().then(({ getUsers }) => { 
  8.     getUsers().then(json => console.log(json)); 
  9.   }); 
  10. }); 

 

作者:Valentino Gagliardi 譯者:前端小智 來源:valentinog 原文:https://www.sitepoint.com/webpack-beginner-guide/

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 大遷世界
相關(guān)推薦

2020-09-18 09:02:20

JavaScript

2024-01-12 14:37:29

智能家居人工智能

2022-04-24 15:21:01

MarkdownHTML

2020-12-15 14:05:15

云計(jì)算

2010-06-13 11:13:38

UML初學(xué)者指南

2022-07-22 13:14:57

TypeScript指南

2022-10-10 15:28:45

負(fù)載均衡

2021-05-10 08:50:32

網(wǎng)絡(luò)管理網(wǎng)絡(luò)網(wǎng)絡(luò)性能

2023-07-03 15:05:07

預(yù)測(cè)分析大數(shù)據(jù)

2023-07-28 07:31:52

JavaScriptasyncawait

2022-03-28 09:52:42

JavaScript語言

2022-09-05 15:36:39

Linux日志記錄syslogd

2010-08-26 15:47:09

vsftpd安裝

2018-10-28 16:14:55

Reactreact.js前端

2012-03-14 10:56:23

web app

2023-02-10 08:37:28

2018-05-14 08:53:51

Linux命令shuf

2021-05-06 09:00:00

JavaScript靜態(tài)代碼開發(fā)

2024-12-25 08:00:00

機(jī)器學(xué)習(xí)ML管道人工智能

2014-04-01 10:20:00

開源Rails
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品国产一区二区三区久久影院 | 午夜久久福利视频| 伊人在线视频| 国产成人免费视频一区| 91精品国产91久久久久| 欧美另类69xxxx| 久久久久亚洲精品中文字幕| 大桥未久av一区二区三区| 亚洲视频电影| 亚洲欧美日韩精品永久在线| 久久精品国产秦先生| 国内免费久久久久久久久久久| 国产免费看av| 亚洲国产高清在线观看| 欧美中文字幕亚洲一区二区va在线 | 999亚洲国产精| 亚洲片av在线| 中文字幕视频三区| 在线女人免费视频| 一区二区在线观看免费| 欧美专区一二三| 黄色aaa毛片| 精品一区在线看| 国产99在线|中文| 黄色激情视频在线观看| 国产大片一区| 国产一区二区日韩精品欧美精品| 中文字幕人妻熟女在线| 2019中文亚洲字幕| 欧美午夜电影网| 日本精品免费在线观看| 久久av色综合| 亚洲日本在线观看| 视频一区二区三区在线观看| 神马精品久久| www.欧美.com| 国产高清在线一区二区| 国产精品一区二区人人爽| 免费视频最近日韩| 日韩美女免费视频| 无码无套少妇毛多18pxxxx| 亚洲二区在线| 久久久噜噜噜久久久| 日本aⅴ在线观看| 91日韩在线| 中文字幕亚洲欧美| 久久久久久久久福利| 国产精品片aa在线观看| 亚洲欧美制服第一页| aaaaa级少妇高潮大片免费看| 丁香一区二区| 亚洲国产成人在线播放| 国产精品扒开腿做爽爽爽a片唱戏| 97久久中文字幕| 91精品麻豆日日躁夜夜躁| 婷婷中文字幕在线观看| 国产亚洲观看| 欧美mv日韩mv国产网站app| 欧美xxxx黑人| 成人三级毛片| 亚洲国产一区自拍| 中文字幕免费在线播放| 偷拍亚洲精品| 在线观看日韩专区| 亚洲ⅴ国产v天堂a无码二区| 成人在线一区| 久久精品99久久香蕉国产色戒| www.黄色com| 亚洲女同另类| 久久久久久久久久久av| 国产精品自拍99| 视频在线观看91| 成人免费淫片aa视频免费| 国产又粗又黄又爽的视频| 国产精品一区二区黑丝| 国产亚洲欧美一区二区| 美女做暖暖视频免费在线观看全部网址91 | 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 色综合av综合无码综合网站| a在线免费观看| 一个色综合av| 啊啊啊一区二区| 91av一区| 日韩欧美成人激情| 女同毛片一区二区三区| 国产a久久精品一区二区三区| 在线播放国产一区二区三区| 9999热视频| 国产精品久久国产愉拍| 国产精品视频区1| 国产夫妻自拍av| 久久久久久电影| 亚洲一区尤物| caoporn视频在线| 欧美手机在线视频| 国产精品成人免费一区久久羞羞| 亚洲精品国产精品粉嫩| 久久精品视频免费播放| 日韩女同强女同hd| 久久aⅴ国产欧美74aaa| 精品无码久久久久国产| 拍真实国产伦偷精品| 亚洲国产人成综合网站| 免费看国产黄色片| 欧美激情极品| 久久综合久中文字幕青草| 亚洲另类欧美日韩| 国产真实乱对白精彩久久| 久久草视频在线看| 在线三级中文| 欧美日韩精品一区二区天天拍小说| 五月天丁香社区| 久久成人综合| 日本精品一区二区三区在线播放视频 | 国产精品久久久久久久美男 | 久草精品视频在线观看| 久久成人久久爱| 欧美三级网色| www.youjizz.com在线| 欧美精品乱人伦久久久久久| 狠狠人妻久久久久久综合蜜桃| 91精品国偷自产在线电影| 国产成人啪精品视频免费网| 深爱五月激情五月| 亚洲精选视频在线| wwwwwxxxx日本| 亚洲最好看的视频| 91av视频在线| 香蕉视频免费在线看| 一区二区三区日韩在线观看| www.超碰97.com| 三上亚洲一区二区| 国产精品 欧美在线| 欧美精品久久久久久久久久丰满| 亚洲一区二区影院| 在线视频观看91| 久久国产精品成人免费观看的软件| 午夜精品在线观看| 内射后入在线观看一区| 亚洲精品成人在线| 日韩av自拍偷拍| 五月天激情综合网| 国产在线日韩在线| 里番在线观看网站| 欧美男男青年gay1069videost| 三区四区在线观看| 日韩影院免费视频| 日本一区视频在线观看免费| 欧美电影免费观看网站| 亚洲欧美日韩一区二区在线| 久久久久久91亚洲精品中文字幕| 99精品热视频| 成人一级片网站| 亚洲图区在线| 国产精品久久久久久久久久新婚| 四季av日韩精品一区| 欧美日韩国产精品一区二区三区四区 | 四虎国产成人精品免费一女五男| 亚洲一区免费| 欧美精品一区二区三区久久| 综合另类专区| 国产亚洲欧美日韩美女| 中文字幕视频免费观看| 中文字幕亚洲一区二区av在线 | 国产91对白在线观看九色| 国产午夜精品视频一区二区三区| 一区二区三区视频播放| 97精品在线观看| 久草在线青青草| 欧美日韩一区视频| 国产十六处破外女视频| 成人性生交大合| 成人羞羞国产免费网站| 成人无号精品一区二区三区| 亚洲综合自拍一区| 91九色在线播放| 伊人久久久久久久久久久久久| 在线观看免费中文字幕| 亚洲精品乱码久久久久久黑人| 亚洲啪av永久无码精品放毛片 | 国产伦理在线观看| 亚洲欧美网站| 亚洲一区二区三区免费观看| 中文字幕av一区二区三区四区| 欧美一区视频在线| 免费高清在线观看| 亚洲国产高清福利视频| 自拍偷拍福利视频| 一区二区三区日韩在线观看| 在线国产视频一区| 国产综合久久久久久鬼色 | 麻豆精品视频在线| h无码动漫在线观看| 最新亚洲精品| 97netav| 美女网站视频一区| 欧美激情欧美激情在线五月| 九一在线视频| 亚洲精品一区二区三区精华液 | 亚洲精品电影久久久| 在线观看国产黄| 黄色成人av网| 黑鬼狂亚洲人videos| 久久久久久久久蜜桃| 手机看片国产精品| 青青草97国产精品免费观看| 黄色激情在线视频| 婷婷亚洲五月| 日本精品免费| 国产精品玖玖玖在线资源| 成人免费看黄网站| 亚洲四虎影院| 欧美在线一级va免费观看| 成人video亚洲精品| 国产一区二区三区精品久久久| 俄罗斯嫩小性bbwbbw| 欧美欧美欧美欧美首页| aaa在线视频| 亚洲成a人在线观看| 欧美成欧美va| 国产精品不卡视频| 手机毛片在线观看| 久久精品一级爱片| 欧美在线一级片| 国产成人午夜精品5599| 污网站在线免费| 三级不卡在线观看| 免费毛片小视频| 亚洲精品孕妇| 91精品国产高清| 老女人性淫交视频| 欧美国产欧美综合| 免费污网站在线观看| www.日韩在线| 中文字幕乱码在线| 99精品桃花视频在线观看| 免费黄色在线播放| 国产成人av一区二区三区在线观看| 在线观看免费的av| 精品一区二区在线看| 一女二男3p波多野结衣| 老司机精品视频在线| 欧美成人福利在线观看| 美女一区二区三区在线观看| 国产视频一区二区视频| 日韩中文欧美在线| 国产一级特黄a大片免费| 丝瓜av网站精品一区二区| 日本精品www| 视频一区在线播放| 狠狠躁狠狠躁视频专区| 麻豆精品国产91久久久久久| 亚洲免费999| 国产激情视频一区二区三区欧美| 日韩视频在线观看一区二区三区| 狠狠狠色丁香婷婷综合激情 | 国产在线观看欧美| 国内视频精品| 国产91在线免费| 六月丁香综合| 少妇网站在线观看| 国产乱国产乱300精品| 麻豆tv在线观看| 91丝袜美腿高跟国产极品老师| 亚洲激情视频小说| 国产精品久久久久久久久久久免费看| 亚洲怡红院在线观看| 亚洲一区二区在线免费看| 精品美女久久久久| 在线免费观看不卡av| 国产一区二区在线视频观看| 日韩免费视频一区| 欧美日韩国产综合视频| 中文字幕精品国产| 三级网站视频在在线播放| 91av视频在线| 日韩毛片免费看| 国产精品一区二区三区免费观看| 羞羞答答一区二区| 在线视频不卡一区二区三区| 精品电影一区| 天天爽天天爽夜夜爽| 国产不卡高清在线观看视频| 亚洲天堂网一区二区| 国产精品国产三级国产aⅴ入口| 青青草偷拍视频| 色综合久久久久综合体| 国产特黄一级片| 亚洲乱码国产乱码精品精天堂| 2019中文字幕在线视频| 欧美极品欧美精品欧美视频 | 欧美日韩中文字幕一区二区| 精品人妻无码一区二区| 亚洲精品一区久久久久久| 黄网站在线播放| 奇米一区二区三区四区久久| 99久久这里有精品| 欧美一区二区三区四区在线观看地址 | 欧美一级片在线看| 日本在线视频1区| 久久久国产一区二区三区| 手机在线理论片| 亚洲自拍小视频免费观看| 久操精品在线| 天堂8在线天堂资源bt| 老汉av免费一区二区三区| 在线免费播放av| 亚洲精品大片www| 在线不卡免费视频| 亚洲欧美日韩精品久久奇米色影视| 国产黄色小视频在线| 国产精品国产福利国产秒拍| www.亚洲一二| 国产911在线观看| 久久99日本精品| 娇妻被老王脔到高潮失禁视频| 亚洲国产一二三| 99视频在线观看免费| 中文字幕自拍vr一区二区三区| 欧美激情20| 国产精品综合久久久久久| 亚洲国产精品久久久天堂| 日韩av片网站| 国产午夜精品一区二区| 麻豆久久久久久久久久| 欧美变态tickling挠脚心| 日韩av中文| 国产精品视频久久久久| 国模吧精品视频| 黄色片视频在线播放| 91性感美女视频| 中文字幕一区二区三区精品| 日韩精品一区二区三区视频在线观看| 黄色网页网址在线免费| 国产精品综合不卡av| 日本欧美肥老太交大片| 日日摸天天爽天天爽视频| 91麻豆免费在线观看| 天天操天天爽天天干| 亚洲国产精彩中文乱码av| www.超碰在线| 久久精品国产精品国产精品污| 亚洲精品系列| 国产精品一区二区入口九绯色| 午夜久久久久久久久久一区二区| 粉嫩小泬无遮挡久久久久久| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲图片 自拍偷拍| 综合久久给合久久狠狠狠97色| 超碰在线观看91| 综合激情国产一区| 欧美久久久网站| a级网站在线观看| 国产一区二区毛片| 久久久久性色av无码一区二区| 精品国产免费一区二区三区香蕉| av在线私库| 欧美一级二级三级| 久久超碰97中文字幕| 成人高潮免费视频| 日韩精品一区二区三区三区免费| sm久久捆绑调教精品一区| 欧美日本亚洲| 免费人成在线不卡| 日韩影院一区二区| 亚洲精品一区二区三区香蕉| 欧美极品影院| 一区二区三区四区不卡| 国产精品夜夜嗨| 国产做受高潮漫动| 亚洲视频欧美视频| 91麻豆精品国产91久久久更新资源速度超快| 在线观看国产一区| 成人精品高清在线| 69xxxx国产| 美女久久久久久久| 欧美美女在线直播| 久久撸在线视频| 亚洲国产三级在线| 国产精品ⅴa有声小说| 91精品中国老女人| 夜夜嗨网站十八久久| 亚洲精品自拍视频在线观看| 精品国产污污免费网站入口| 精品众筹模特私拍视频| 亚洲一区二区免费视频软件合集 | 国产美女情趣调教h一区二区| 久久国产精品免费一区| 美女久久久精品| 国产精品第九页| 色噜噜国产精品视频一区二区 | japanese23hdxxxx日韩| 可以免费看的黄色网址| 久久亚洲一级片| 国产ts变态重口人妖hd| 人妖精品videosex性欧美| 欧美成人一品| 我不卡一区二区| 亚洲国产成人久久| 国产一区二区三区免费观看在线|