vue-loader提供給webpack使用。主要提供如下的幾點特性css
<style>
是Sass預處理器,對於<template>
能夠是Pug模版引擎<template>
<div></div>
</template>
<script>
export default {
}
</script>
<style>
</style>
複製代碼
<style>
和<template>
中引用的靜態資產視爲模塊依賴項,並使用webpack加載器處理它們;vue-loader
與webpack
的結合爲咱們提供了強大的工做流html
接下來看看他是如何工做的vue
使用 @vue/component-compiler-utils
將SFC源代碼解析爲SFC描述符,而後,它爲每種語言塊生成一個導入,所以實際返回的模塊代碼以下所示webpack
// code returned from the main loader for 'source.vue'
// import the <template> block
import render from 'source.vue?vue&type=template'
// import the <script> block
import script from 'source.vue?vue&type=script'
export * from 'source.vue?vue&type=script'
// import <style> blocks
import 'source.vue?vue&type=style&index=1'
script.render = render
export default script
複製代碼
代碼都是從source.vue中導入的,可是域不一樣。web
若是咱們想指定對應區塊內的語言,好比<script lang="ts">
, 這時候VueLoaderPlugin
派上用場,對於webpack配置中的每一個模塊規則,它都會建立一個針對相應Vue語言塊請求的修改後的克隆。sass
假設已經爲全部* .js文件配置了babel-loader。該規則將被克隆並應用於Vue SFC <script>
塊。在webpack內部,相似於下面的請求babel
import script from 'source.vue?vue&type=script'
複製代碼
將被轉換爲markdown
import script from 'babel-loader!vue-loader!source.vue?vue&type=script'
複製代碼
若是你爲爲* .scss文件配置了style-loader + css-loader + sass-loader。post
<style scoped lang="scss">
複製代碼
vue-loader
將其轉換爲spa
import 'source.vue?vue&type=style&index=1&scoped&lang=scss'
複製代碼
webpack
將其轉換爲
import 'style-loader!css-loader!sass-loader!vue-loader!source.vue?vue&type=style&index=1&scoped&lang=scss'
複製代碼
處理擴展的請求時, vue-loader
會被再次調用,此次webpack
加載程序會注意到請求具備查詢而且僅針對特定的塊,選擇目標塊的內部內容,並將其傳遞給匹配的目標裝載程序。
對於<script
>塊,轉換基本結束,對於<template>
和 <style>
塊來講,還有一些額外的任務須要執行。
須要使用Vue模板編譯器來編譯模板
須要在css-loader
執行前, 對<style scoped>
塊進行處理
從技術上講,這些是額外的裝載機(templateLoader,stylePostLoader),須要注入擴展的加載程序鏈中,若是最終用戶必須本身配置,那將很是複雜,因此 VueLoaderPlugin
也注入了全局的加載器來攔截<template>
和 <style>
的塊請求,並注入必要的裝載機最終請求以下所示。
// <template lang="pug">
import 'vue-loader/template-loader!pug-loader!vue-loader!source.vue?vue&type=template'
// <style scoped lang="scss">
import 'style-loader!css-loader!vue-loader/style-post-loader!sass-loader!vue-loader!source.vue?vue&type=style&index=1&scoped&lang=scss'
複製代碼