如何分析Webpack代碼分離-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關如何分析Webpack代碼分離,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

站在用戶的角度思考問題,與客戶深入溝通,找到欽南網(wǎng)站設計與欽南網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站設計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、雅安服務器托管、企業(yè)郵箱。業(yè)務覆蓋欽南地區(qū)。

Webpack 代碼分離

 提示:

  1. 版本問題

下面基于 webpack 2.x 版本。webpack 2.x 相比 webpack 1.x 有重大改變。所以,如果你的項目中已使用了 webpack 1.x ,本教程的示例將不適用,請慎重。

如果鐵了心要升級 webpack ,請參考 webpack 官方文檔 - 從 v1 遷移到 v2

  1. 閱讀建議

閱讀前建議先閱讀 Webpack 概念 。

代碼分離是 webpack 中最引人注目的特性之一。

你可以把你的代碼分離到不同的 bundle 中,然后你就可以去按需加載這些文件。

總的來說, webpack 分離可以分為兩類:

  • 資源分離

  • 代碼分離

資源分離(Resource Splitting)

對第三方庫(vendor) 和 CSS 進行代碼分離,這些方式有助于實現(xiàn)緩存和并行加載。

分離 CSS(CSS Splitting)

你可能也想將你的樣式代碼分離到單獨的 bundle 中,以此使其獨立于應用程序邏輯。這加強了樣式的可緩存性,并且使得瀏覽器能夠并行加載應用程序代碼中的樣式文件,避免 FOUC 問題 (無樣式內(nèi)容造成的閃爍)。

安裝 ExtractTextWebpackPlugin 如下

$ npm install --save-dev extract-text-webpack-plugin

webpack.config.js 中需要按下面進行配置:

const ExtractTextPlugin = require('extract-text-webpack-plugin');module.exports = {

  // 關于模塊配置
  module: {

    // 模塊規(guī)則(配置 loader、解析器等選項)
    rules: [      {
        // css 加載
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          use: "css-loader"
        })      }
    ]  },

  // 附加插件列表
  plugins: [    // 將樣式文件獨立打包
    new ExtractTextPlugin("styles.css")
  ]};

 示例DEMO09: (DEMO / SOURCE)

分離第三方庫(Vendor Code Splitting)

一個典型的應用程序,由于框架/功能性需求,會依賴于許多第三方庫的代碼。不同于應用程序代碼,這些第三方庫代碼不會頻繁修改。

如果我們將這些庫(library)中的代碼,保留在與應用程序代碼相獨立的 bundle 中,我們就可以利用瀏覽器緩存機制,把這些文件長時間地緩存在用戶機器上。

為了完成這個目標,不管應用程序代碼如何變化,vendor 文件名中的 hash 部分必須保持不變。學習如何使用 CommonsChunkPlugin 分離 vendor/library 代碼。

webpack.config.js

const webpack = require('webpack');module.exports = {
  // 這里應用程序開始執(zhí)行
  // webpack 開始打包
  // 本例中 entry 為多入口
  entry: {
    main: "./app/index",
    vendor: "react"
  },
  
  // webpack 如何輸出結果的相關選項
  output: {
    // 所有輸出文件的目標路徑
    // 必須是絕對路徑(使用 Node.js 的 path 模塊)
    path: path.resolve(__dirname, "dist"),

    // 「入口分塊(entry chunk)」的文件名模板(出口分塊?)
    // filename: "bundle.min.js",
    // filename: "[name].js", // 用于多個入口點(entry point)(出口點?)
    // filename: "[chunkhash].js", // 用于長效緩存
    filename: "[name].[chunkhash:8].js", // 用于長效緩存
  },

  // 附加插件列表
  plugins: [    new webpack.optimize.CommonsChunkPlugin({
      name: "vendor" // 指定公共 bundle 的名字。
    })
  ]};

在上面的配置中,

  1. 在 entry 屬性中,將 react 指定為一個獨立的入口 vendor;

  2. 然后,在 output 屬性中,將 filename 指定為 [name].[chunkhash:8].js,這表示輸出文件的文件名樣式。

  3. 最后在 plugins 列表中引入 CommonsChunkPlugin 插件,用來指定 bundle 。

執(zhí)行 webpack 命令后,webpack 會生成 2 個 bundle 文件,形式如:

main.bef8f974.jsvendor.2f1bd4c8.js

 示例DEMO10: (DEMO / SOURCE)

代碼按需分離(On Demand Code Splitting)

雖然前面幾類資源分離,需要用戶預先在配置中指定分離模塊,但也可以在應用程序代碼中創(chuàng)建動態(tài)分離模塊。

這可以用于更細粒度的代碼塊,例如,根據(jù)我們的應用程序路由,或根據(jù)用戶行為預測。這可以使用戶按照實際需要加載非必要資源。

前一節(jié),我們了解了 webpack 可以將資源拆分為bundle。接下來,我們要學習如何異步加載。例如,這允許首先提供最低限度的引導 bundle,并在稍后再異步地加載其他功能。

webpack 支持兩種相似的技術實現(xiàn)此目的:使用 import() (推薦,ECMAScript 提案) 和 require.ensure() (遺留,webpack 特定)。本文只介紹官方推薦的 import() 方式。

ES2015 loader 規(guī)范定義了 import() 作為一種在運行時(runtime)動態(tài)載入 ES2015 模塊的方法。

webpack 把 import() 作為一個分離點(split-point),并把引入的模塊作為一個單獨的 chunk。 import() 將模塊名字作為參數(shù)并返回一個 Promoise 對象,即 import(name) -> Promise

配合 Babel 使用

如果你想要在 Babel 中使用 import,但是由于 import() 還是屬于 Stage 3 的特性,所以你需要安裝/添加 syntax-dynamic-import 插件來避免 parser 報錯。在草案正式成為規(guī)范后,就不再需要這個插件了。

例:

我們來定義一個 Clock 組件,動態(tài)引入 moment 庫。

首先,安裝 moment 庫。

$ npm install --save-dev moment

JavaScript 代碼:

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = { date: new Date().toLocaleDateString() };
    this.click = this.click.bind(this);
  }

  click() {
    // 動態(tài)引入import()
    import('moment')
      .then(moment => moment().format("MMMM Do YYYY, h:mm:ss a"))
      .then(str => this.setState({date:str}))
      .catch(err => console.log("Failed to load moment", err));
  }

  render() {
    return (      <div>
        <h3>It is {this.state.date}.</h3>        <p onClick={this.click}>Click here to changing the time.</p>
      </div>    );  }}

webpack.config.js

// 關于模塊配置module: {

  // 模塊規(guī)則(配置 loader、解析器等選項)
  rules: [    {
      // 語義解釋器,將 js/jsx 文件中的 es2015/react 語法自動轉為瀏覽器可識別的 Javascript 語法
      test: /\.jsx?$/,
      include: path.resolve(__dirname, "app"),

      // 應該應用的 loader,它相對上下文解析
      // 為了更清晰,`-loader` 后綴在 webpack 2 中不再是可選的
      // 查看 webpack 1 升級指南。
      loader: "babel-loader",

      // loader 的可選項
      options: {
        presets: ["es2015", "react"],
        plugins: ['syntax-dynamic-import']      },
    },
  ]},

以上就是如何分析Webpack代碼分離,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

新聞標題:如何分析Webpack代碼分離-創(chuàng)新互聯(lián)
文章路徑:http://muchs.cn/article38/dpjesp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App設計、域名注冊、網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作、網(wǎng)站維護網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計