<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                &emsp;&emsp;webpack是一個靜態模塊打包器,此處的模塊可以是任意文件,包括Sass、TypeScript、模板和圖像等。webpack可根據輸入文件的依賴關系,打包輸出瀏覽器可識別的JavaScript、CSS和HTML等文件,并且能對圖像做優化處理,如圖1所示。 :-: ![](https://img.kancloud.cn/a0/69/a0698348b7b3da6c2eed00fb40f2edb0_600x229.png) 圖1 webpack打包 &emsp;&emsp;目前,webpack的最新版本是4.33,其配置文件(webpack.config.js)的基本結構如下所示,包含了它的4個核心概念:入口(entry)、輸出(output)、加載器(loader)和插件(plugin)。 ~~~ module.exports = { entry: {},   //入口 output: {},    //輸出 module: { rules: [] }, //加載器 plugins: []    //插件 }; ~~~ ## 一、安裝 &emsp;&emsp;如果要安裝最新版本的webpack,那么可以運行下面這條命令。 ~~~ npm install --save-dev webpack ~~~ &emsp;&emsp;當使用的是webpack 4+版本時,還需要再安裝它的命令行工具,安裝命令如下所示。 ~~~ npm install --save-dev webpack-cli ~~~ &emsp;&emsp;接下來就可以運行webpack的打包命令了,如下所示,其中“--config”參數后面會跟著配置文件的路徑。 ~~~ npx webpack --config webpack.config.js ~~~ &emsp;&emsp;通過package.json的scripts字段可聲明自定義的腳本任務(如下代碼所示),從而就能快捷的執行打包命令,例如“npm run build”。 ~~~ { scripts: { build: "npx webpack --config webpack.config.js" } } ~~~ ## 二、入口 &emsp;&emsp;在webpack.config.js中,entry字段是一個入口,記錄著需要處理的模塊。從這個入口開始,webpack會遞歸地構建出模塊之間的依賴關系。 **1)單個入口** &emsp;&emsp;當entry字段是一個字符串類型時,其值就是模塊的相對或絕對路徑,如下所示。 ~~~ module.exports = { entry: "./index.js" }; ~~~ &emsp;&emsp;這其實是一種簡寫,等價于下面的對象形式。對象的鍵就是chunk的名稱,[chunk](https://webpack.docschina.org/glossary)是webpack的特定術語,通常一個chunk對應或多個chunk組成一個bundle(即打包生成的文件)。 ~~~ module.exports = { entry: { main: "./index.js" } }; ~~~ &emsp;&emsp;entry字段的值既可以是對象和字符串,也可以是由模塊路徑組成的數組,如下代碼所示,其中index.js和list.js兩個文件會被合并成一個chunk。 ~~~ module.exports = { entry: ["./index.js", "./list.js"] }; ~~~ **2)多個入口** &emsp;&emsp;只要在entry的對象中添加多個屬性就能設置多個入口,如下所示。 ~~~ module.exports = { entry: { index: "./index.js", list: __dirname + "/list.js" } }; ~~~ &emsp;&emsp;兩個chunk會被分別命名為index和list,其中\_\_dirname是Node.js內置的全局變量,保存著當前文件所處目錄的絕對路徑。 ## 三、輸出 &emsp;&emsp;在webpack.config.js中,output字段是一個對象,用于配置輸出的信息。它的filename屬性可聲明輸出的文件名,而另一個path屬性可配置輸出目錄的絕對路徑。與入口不同,在配置文件中只能存在一個輸出。 **1)filename** &emsp;&emsp;如果在入口中聲明了多個chunk,那么在配置輸出時得用占位符來表示對應的bundle名稱,如下所示。 ~~~ module.exports = { entry: { index: "./index.js", list: "./list.js" }, output: { filename: "[name].bundle.js" } }; ~~~ &emsp;&emsp;\[name\]表示chunk的名稱,例如index和list,還有另外三個常用的占位符,如表3所示。 :-: ![](https://img.kancloud.cn/07/39/073987347eadf2065033402b831e7634_600x301.png) 表3 filename中的占位符 &emsp;&emsp;\[hash\]常與\[name\]配合使用(如下所示),在運行打包命令后,默認會在配置文件所處的位置創建dist目錄,并且把生成的bundle文件放置其中。 ~~~ module.exports = { output: { filename: "[name].[hash].bundle.js" } }; ~~~ **2)path** &emsp;&emsp;如果要更改默認的輸出路徑(即不想在dist目錄下生成bundle文件),那么可以通過設置path實現。但要注意,它的值必須是絕對路徑,不能是相對路徑,如下所示。 ~~~ module.exports = { output: { path: __dirname + "/build" } }; ~~~ ## 四、加載器 &emsp;&emsp;加載器(loader)能在webpack加載模塊時對其進行預處理,即對模塊的源碼進行轉換,下面列出加載器的幾個比較典型的用途。 &emsp;&emsp;(1)將瀏覽器無法識別的JSX、Sass等語言轉換成JavaScript、CSS等語言。 &emsp;&emsp;(2)把圖像轉換成Data URI格式嵌入到JavaScript文件中。 &emsp;&emsp;(3)用ES6的import關鍵字將CSS文件導入到JavaScript中。 **1)配置** &emsp;&emsp;加載器不僅需要單獨安裝,還得在webpack.config.js中配置module字段。下面是一個簡單的配置示例,其作用是讓file-loader加載器處理四種類型的圖像。 ~~~ module.exports = { module: { rules: [{ test: /\.(png|svg|jpg|gif)$/, use: [ "file-loader" ] }] } }; ~~~ &emsp;&emsp;module的值是一個對象,包含一個rules屬性,記錄了模塊匹配的規則,而這些規則又會以對象的形式組成一個數組,作為rules屬性的值。每條規則必須包含test和use兩個屬性,前者是一個正則表達式,可設置匹配條件;后者是一個由字符串或對象組成的數組,可指定要使用的加載器。只有當test屬性中的條件匹配成功后,才會讓use屬性中的加載器處理相應的模塊。 &emsp;&emsp;接下來將展示加載器的用法,以上面的file-loader為例,首先通過命令將其安裝,如下所示。 ~~~ npm install --save-dev file-loader ~~~ &emsp;&emsp;然后創建一個index.js文件,其內容就是引入一張avatar.jpg圖像,并將實例化的Image對象添加到頁面的元素內,如下所示。 ~~~ import src from "./avatar.jpg"; var img = new Image(); img.src = src; document.body.appendChild(img); ~~~ &emsp;&emsp;再創建一張index.html頁面,引用打包生成的index.bundle.js文件,如下所示。 ~~~ <body> <script src="dist/index.bundle.js"></script> </body> ~~~ &emsp;&emsp;最后執行webpack的打包命令,就會在index.html的元素中添加下面的元素。 ~~~ <img src="68fd51ab711118f323bdddf6de7a0175.jpg" /> ~~~ &emsp;&emsp;注意,默認情況下,圖像會隨著bundle文件一起被放置到dist目錄下。這樣的話,上述元素將無法讀取到圖像,得為其src屬性加上路徑。為了解決該問題,可以利用file-loader提供的配置參數。下面將use屬性中的規則修改成對象形式,用options參數記錄publicPath選項,即定義圖像的發布目錄。 ~~~ module.exports = { module: { rules: [{ test: /\.(png|svg|jpg|gif)$/, use: [{ loader: "file-loader", options: { publicPath: "./dist" } }] }] } }; ~~~ &emsp;&emsp;當一個條件對應多個加載器時,其執行順序是從右到左。以下面的加載器為例,先執行url-loader,后執行file-loader。 ~~~ module.exports = { module: { rules: [{ test: /\.(png|svg|jpg|gif)$/, use: [ "file-loader", "url-loader" ] }] } }; ~~~ &emsp;&emsp;由于目前市面上的加載器有可能無法滿足實際需求,因此官方提供了自定義加載器的方法,具體可參考[相關文檔](https://www.webpackjs.com/contribute/writing-a-loader/)。 **2)Babel** &emsp;&emsp;在之前的[第2篇](https://www.cnblogs.com/strick/p/10984632.html)中,對Babel做了專門的講解,現在利用加載器可以將Babel的配置寫到webpack.config.js中,接下來將演示在webpack中使用Babel。 &emsp;&emsp;首先安裝babel-loader、Babel的核心包以及集合了ES語法的預設,命令如下所示。 ~~~ npm install --save-dev babel-loader @babel/core @babel/preset-env ~~~ &emsp;&emsp;然后在webpack.config.js的module字段中配置規則,如下所示。 ~~~ module.exports = { module: { rules: [{ test: /\.js$/, exclude: /node_modules/, use: [{ loader: "babel-loader", options: { presets: ['@babel/preset-env'] } }] }] } }; ~~~ &emsp;&emsp;rules中的exclude屬性定義了忽略的條件,即不會對node\_modules目錄中的腳本文件執行babel-loader。在babel-loader的presets選項中聲明了所使用的預設。當執行打包命令后,就會對下面這樣的ES6語法進行編譯,轉換成低版本的ES語法。 ~~~ let fn = () => true; ~~~ ## 五、插件 &emsp;&emsp;插件能夠借助webpack引擎的能力,將自定義的行為注入到webpack的構建流程中,解決加載器無法實現的功能,例如分離打包、壓縮文件等。插件不僅能處理模塊和編譯過的資源,還能監控文件的變化。與加載器一樣,插件也可根據特定需求實現自定義,具體可參考[官方文檔](https://www.webpackjs.com/contribute/writing-a-plugin/)。 &emsp;&emsp;插件的配置被放在了plugins字段中,它的值是一個由插件實例組成的數組。接下來將通過html-webpack-plugin來演示插件的用法。 **1)配置** &emsp;&emsp;html-webpack-plugin不僅能根據模板生成一個HTML文件,還能自動引入所需的bundle文件,對于那些隨著編譯而發生名稱變化的bundle文件特別有用。 &emsp;&emsp;要使用它,首先需要將其安裝,相關的命令如下所示。 ~~~ npm install --save-dev html-webpack-plugin ~~~ &emsp;&emsp;然后在webpack.config.js中聲明插件的實例,如下配置所示,在初始化插件時,沒有為其傳遞任何參數。 ~~~ var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { index: "./index.js" }, output: { filename: "[name].[hash].bundle.js" }, plugins: [ new HtmlWebpackPlugin() ] }; ~~~ &emsp;&emsp;最后執行打包命令,生成的HTML文件如下所示,其中腳本文件的名稱包含了一個hash值。 ~~~ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Webpack App</title> </head> <body> <script src="index.4ee657c406f9babd171a.bundle.js"></script> </body> </html> ~~~ **2)自定義模板** &emsp;&emsp;除了上面所使用的默認模板之外,html-webpack-plugin還提供了自定義模板的功能。默認情況下,html-webpack-plugin采用的是EJS模板引擎,聲明的加載器是ejs-loader。如果要使用其它模板引擎,那么必須得把相應的加載器添加到配置文件中。 &emsp;&emsp;下面利用[EJS模板的語法](https://ejs.co/#docs)插入頁面標題,首先創建一個template.html模板文件,如下所示。 ~~~ <!DOCTYPE html> <html> <head> <title><%= htmlWebpackPlugin.options.title %></title> <meta charset="utf-8" /> </head> <body> <div>模板內容</div> </body> </html> ~~~ &emsp;&emsp;然后向插件傳遞兩個參數:title和template,前者就是頁面標題,后者是模板路徑。如此設置之后,就能渲染出所需要的頁面了。 ~~~ module.exports = { plugins: [ new HtmlWebpackPlugin({ title: "模板", template: "./template.html" }) ] }; ~~~ ## 六、模塊化 &emsp;&emsp;webpack實現了一套兼容所有模塊化方案的機制,這讓任意文件皆有可能成為模塊,而構建依賴圖和按需打包等功能則都由webpack內部完成。 &emsp;&emsp;在webpack中,能夠表達模塊之間依賴關系的方式有多種,例如下面所列的。 &emsp;&emsp;(1)CommonJS規范的require()函數。 &emsp;&emsp;(2)AMD規范的define()函數。 &emsp;&emsp;(3)ES6標準的import語句。 &emsp;&emsp;(4)Sass和Less中的@import語句。 &emsp;&emsp;(5)CSS中引用圖像的url()函數。 &emsp;&emsp;(6)元素用于加載圖像的src屬性。 ***** > 原文出處: [博客園-前端利器躬行記](https://www.cnblogs.com/strick/category/1472499.html) [知乎專欄-前端利器躬行記](https://zhuanlan.zhihu.com/pwtool) 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。 ![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200) 推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看