最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
三言兩語(yǔ)說(shuō)透webpack對(duì)vue的編譯

1寫在前面

Webpack作為當(dāng)下最流行的前端構(gòu)建工具,它可以處理模塊化的JavaScript項(xiàng)目,進(jìn)行代碼打包和優(yōu)化。在Vue項(xiàng)目中,Webpack發(fā)揮著不可或缺的作用,它負(fù)責(zé)分析項(xiàng)目中的依賴圖譜,遞歸地構(gòu)建bundles,從而實(shí)現(xiàn)整個(gè)項(xiàng)目的構(gòu)建。

那么Webpack是如何處理Vue單文件組件的呢?它又是通過(guò)哪些具體的步驟實(shí)現(xiàn)Vue項(xiàng)目的打包和部署的呢?這是每一個(gè)Vue開發(fā)者都應(yīng)該理解和掌握的關(guān)鍵知識(shí)點(diǎn)。

2前置條件

當(dāng)我們使用Vue CLI創(chuàng)建一個(gè)Vue項(xiàng)目時(shí),會(huì)自動(dòng)配置Webpack相關(guān)的配置。在項(xiàng)目的根目錄下會(huì)有一個(gè)webpack.config.js文件,這就是Webpack的配置文件。

我們來(lái)看一下這個(gè)配置文件中與Vue相關(guān)的主要內(nèi)容:

// webpack配置
const vueLoaderPlugin = require('vue-loader/lib/plugin') 

module.exports = {
  // ...省略其他配置
  
  module: {
    rules: [
      // ... 其他規(guī)則
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },

  plugins: [
    // 請(qǐng)確保引入這個(gè)插件!
    new vueLoaderPlugin()
  ]
}

vue-loader是Vue單文件組件(SFC)的 Webpack 加載器,它允許你以單文件組件的格式開發(fā) Vue 組件。在 Vue 3 中,vue-loader 封裝了 @vue/compiler-sfc,用于預(yù)處理單文件組件。我們來(lái)看看 vue-loader 的源碼是如何工作的。

3源碼分析

在vue-loader的源碼中,定義了一個(gè) NormalModule 類,這是 webpack 模塊中代表一個(gè)模塊的類。在它的 build 方法中,會(huì)調(diào)用 this._compile 方法對(duì)單文件組件進(jìn)行加載和解析:

// webpack/lib/NormalModule.js

class NormalModule {
  // ...
  build(options, compilation, resolver, fs, callback) {
    this._compile(options, compilation, resolver, fs, (err, result) => {
      // 處理結(jié)果...
    });
  }

  _compile(options, compilation, resolver, fs, callback) {
    const loaderContext = this.createLoaderContext(resolver, options, fs, compilation);

    runLoaders(
      {
        resource: this.resource,
        loaders: this.loaders,
        context: loaderContext,
        readResource: fs.readFile.bind(fs)
      },
      (err, result) => {
        // 處理結(jié)果...
      }
    );
  }
}

在 _compile 中,會(huì)調(diào)用 runLoaders 方法,執(zhí)行配置的所有 loader,其中就包含了 vue-loader。

接下來(lái)我們看一下 vue-loader 的源碼,主要的是 pitch 方法:

// vue-loader/index.js

module.exports.pitch = function(remainingRequest) {
  const { loaders, resourcePath, resourceQuery } = this;

  const doTransform = !remainingRequest.includes(hotReloadAPIPath); 
  // 過(guò)濾熱重載請(qǐng)求

  if (doTransform && resourceQuery && resourceQuery.includes('type=script')) {
    // 處理