摘要:筆者系貢獻(xiàn)者之一官方說明簡單來說就是將文件變成,然后放入瀏覽器運行。部分首先分析部分從做右到左,也就是被先后被和處理過了。源碼解析之二源碼解析之三寫作中源碼解析之四寫作中作者博客作者微博
官方說明筆者系 vue-loader 貢獻(xiàn)者(#16)之一
vue-loader is a loader for Webpack that can transform Vue components written in the following format into a plain JavaScript module
簡單來說就是:將 .vue 文件變成 .bundle.js,然后放入瀏覽器運行。
觀察輸入輸出 輸入測試是最好的文檔,所以我們從測試用例開始分析,找到test/fixture/basic.vue,內(nèi)容如下:
輸出{{msg}}
通過運行測試之后,可以得到以下輸出,但是由于文件巨大,筆者只抽出部分開始分析,如下
/* 2 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); // CONCATENATED MODULE: ./node_modules/babel-loader/lib!./lib/selector.js?type=script&index=0&bustCache!./test/fixtures/basic.vue /* harmony default export */ var basic = ({ data() { return { msg: "Hello from Component A!" }; } }); // CONCATENATED MODULE: ./lib/template-compiler?{"id":"data-v-b647d0ce","hasScoped":false,"buble":{"transforms":{}}}!./lib/selector.js?type=template&index=0&bustCache!./test/fixtures/basic.vue var render = function() { var _vm = this var _h = _vm.$createElement var _c = _vm._self._c || _h return _c("h2", { staticClass: "red" }, [_vm._v(_vm._s(_vm.msg))]) } var staticRenderFns = [] render._withStripped = true var esExports = { render: render, staticRenderFns: staticRenderFns } /* harmony default export */ var fixtures_basic = (esExports); if (false) { module.hot.accept() if (module.hot.data) { require("vue-hot-reload-api") .rerender("data-v-b647d0ce", esExports) } } // CONCATENATED MODULE: .!./test/fixtures/basic.vue var disposed = false function injectStyle (ssrContext) { if (disposed) return __webpack_require__(3) } var normalizeComponent = __webpack_require__(8) /* script */ /* template */ /* template functional */ var __vue_template_functional__ = false /* styles */ var __vue_styles__ = injectStyle /* scopeId */ var __vue_scopeId__ = null /* moduleIdentifier (server only) */ var __vue_module_identifier__ = null var Component = normalizeComponent( basic, fixtures_basic, __vue_template_functional__, __vue_styles__, __vue_scopeId__, __vue_module_identifier__ ) Component.options.__file = "test/fixtures/basic.vue" if (Component.esModule && Object.keys(Component.esModule).some(function (key) { return key !== "default" && key.substr(0, 2) !== "__"})) { console.error("named exports are not supported in *.vue files.")} })()}分析輸出
以上的輸出就是最終可以拿到瀏覽器上運行的 javaScript,盡管筆者已經(jīng)刪除了一些會影響理解的部分代碼,但是這么直接觀察這個文件,難免還是無從下手。
那么我們繼續(xù)細(xì)化分析步驟,vue-loader 將 basic.vue 編譯到最終輸出的 bundle.js 的過程中,其實調(diào)用了四個小的 loader。它們分別是:
selector
style-compiler
template-compiler
babel-loader
以上四個 loader ,除了 babel-loader 是外部的package,其他三個都存在于 vue-loader 的內(nèi)部(lib/style-compiler 和 lib/template-compiler 和 lib/selector)。
首先 vue-loader 將 basic.vue 編譯成以下內(nèi)容
/* script */ import __vue_script__ from "!!babel-loader!../../lib/selector?type=script&index=0&bustCache!./basic.vue" /* template */ import __vue_template__ from "!!../../lib/template-compiler/index?{"id":"data-v-793be54c","hasScoped":false,"buble":{"transforms":{}}}!../../lib/selector?type=template&index=0&bustCache!./basic.vue" /* styles */ import __vue_styles__ from "!!vue-style-loader!css-loader!../../lib/style-compiler/index?{"vue":true,"id":"data-v-793be54c","scoped":false,"hasInlineConfig":false}!../../lib/selector?type=styles&index=0&bustCache!./basic.vue" var Component = normalizeComponent( __vue_script__, __vue_template__, __vue_template_functional__, __vue_styles__, __vue_scopeId__, __vue_module_identifier__ )
為了方便理解,筆者刪除修改了一些內(nèi)容。
在三個 import 語句中,不管它們用了多少個不同的 loader 去加載,loader chain 的源頭都是 basic.vue。
JavaScript 部分首先分析 script 部分
/* script */ import __vue_script__ from "!!babel-loader!../../lib/selector?type=script&index=0&bustCache!./basic.vue"
從做右到左,也就是 basic.vue 被先后被 selector 和 babel-loader 處理過了。
selector(參數(shù)type=script) 的處理結(jié)果是將 basic.vue 中的 javaScript 抽出來之后交給babel-loader去處理,最后生成可用的 javaScript
Template 部分再來分析 template 部分
/* template */ import __vue_template__ from "!!../../lib/template-compiler/index?{"id":"data-v-793be54c","hasScoped":false,"buble":{"transforms":{}}}!../../lib/selector?type=template&index=0&bustCache!./basic.vue"
同樣的,從左到右,basic.vue 先后被 selector 和 template-compiler 處理過了。
selector (參數(shù)type=template) 的處理結(jié)果是將 basic.vue 中的 template 抽出來之后交給 template-compiler 處理,最終輸出成可用的 HTML。
Style 部分最后分析 style 部分
/* styles */ import __vue_styles__ from "!!vue-style-loader!css-loader!../../lib/style-compiler/index?{"vue":true,"id":"data-v-793be54c","scoped":false,"hasInlineConfig":false}!../../lib/selector?type=styles&index=0&bustCache!./basic.vue"
style 涉及的 loader 較多,一個一個來分析, 從上代碼可知,basic.vue 先后要被 selector, style-compiler, css-loader 以及 vue-style-loader 處理。
selector (參數(shù)type=style) 的處理結(jié)果是將 basic.vue 中的 css 抽出來之后交給 style-compiler 處理成 css, 然后交給 css-loader 處理生成 module, 最后通過 vue-style-loader 將 css 放在 里面,然后注入到 HTML 里。
注意,這里之所以沒有用 style-loader 是因為 vue-style-loader 是在 fork 了 style-loader 的基礎(chǔ)上,增加了后端繪制 (SSR) 的支持。具體的不同,讀者可以查看官方文檔,筆者這里不再累述。
后續(xù)通過上面的介紹,想必讀者已經(jīng)對 vue-loader 以及它涉及的幾個 loader 的作用有了一個大概的了解。
那么接下來,在后續(xù)文章中我們來開始一個個分析這幾個 loader 的源碼。
vue-loader 源碼解析之二 selector
vue-loader 源碼解析之三 style-compiler (寫作中)
vue-loader 源碼解析之四 template-compiler (寫作中)
作者博客
作者微博
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90064.html
摘要:當(dāng)前正在處理的節(jié)點,以及該節(jié)點的和等信息。源碼解析之一整體分析源碼解析之三寫作中源碼解析之四寫作中作者博客作者作者微博 筆者系 vue-loader 貢獻(xiàn)者之一(#16) 前言 vue-loader 源碼解析系列之一,閱讀該文章之前,請大家首先參考大綱 vue-loader 源碼解析系列之 整體分析 selector 做了什么 const path = require(path) co...
摘要:相關(guān)的內(nèi)容為這樣對于一個處理的第二階段也就結(jié)束了,通過去攔截不同類型的,并返回新的,跳過后面的的執(zhí)行,同時在內(nèi)部會剔除掉,這樣在進(jìn)入到下一個處理階段的時候,不在使用的范圍之內(nèi),因此下一階段便不會經(jīng)由來處理。 文章首發(fā)于個人github blog: Biu-blog,歡迎大家關(guān)注~ Webpack 系列文章: Webpack Loader 高手進(jìn)階(一)Webpack Loader 高手...
摘要:以為例,編寫來幫助我們完成重復(fù)的工作編譯壓縮我只要執(zhí)行一下就可以檢測到文件的變化,然后為你執(zhí)行一系列的自動化操作,同樣的操作也發(fā)生在這些的預(yù)處理器上。的使用是針對第三方類庫使用各種模塊化寫法以及語法。 showImg(https://segmentfault.com/img/bVbtZYK); 一:前端工程化的發(fā)展 很久以前,互聯(lián)網(wǎng)行業(yè)有個職位叫做 軟件開發(fā)工程師 在那個時代,大家可能...
閱讀 2908·2021-11-23 09:51
閱讀 1554·2021-11-15 11:36
閱讀 3013·2021-10-13 09:40
閱讀 1893·2021-09-28 09:35
閱讀 13075·2021-09-22 15:00
閱讀 1372·2019-08-29 13:56
閱讀 2929·2019-08-29 13:04
閱讀 2702·2019-08-28 18:06