国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

vue-loader中引入模板預處理器的實現

來源:懂視網 責編:小采 時間:2020-11-27 21:51:13
文檔

vue-loader中引入模板預處理器的實現

vue-loader中引入模板預處理器的實現:vue-loader 是一個 webpack 的 loader,可以將指定格式編寫的 Vue 組件轉換為 JavaScript模塊 同時,vue-loader 支持使用非默認語言,通過設置語言塊的lang屬性,就可以使用指定的預處理器,比如最常見的sass 語法: <style lang=
推薦度:
導讀vue-loader中引入模板預處理器的實現:vue-loader 是一個 webpack 的 loader,可以將指定格式編寫的 Vue 組件轉換為 JavaScript模塊 同時,vue-loader 支持使用非默認語言,通過設置語言塊的lang屬性,就可以使用指定的預處理器,比如最常見的sass 語法: <style lang=

vue-loader 是一個 webpack 的 loader,可以將指定格式編寫的 Vue 組件轉換為 JavaScript模塊

同時,vue-loader 支持使用非默認語言,通過設置語言塊的lang屬性,就可以使用指定的預處理器,比如最常見的sass 語法:

<style lang="sass">
 ...
</style>

這里重點討論使用不同的js模板引擎作為預處理器,

下面示例使用了pug模板引擎

<template lang="pug">
 div
 h1 Hello world!
</template>

1. 支持哪些模板引擎

v14 或更低版本使用 consolidate 來編譯 <template lang="xxx">, 所以支持的模板引擎,從consolidate的支持列表中可以找到,包括了大部分引擎,

在vue-loader/preprocessor.js 文件里面,

// loader for pre-processing templates with e.g. pug
const cons = require('consolidate')
const loaderUtils = require('loader-utils')
const { loadOptions } = require('../utils/options-cache')

module.exports = function (content) {
 const callback = this.async()
 const opt = loaderUtils.getOptions(this) || {}

 if (!cons[opt.engine]) {
 return callback(
 new Error(
 "Template engine '" +
 opt.engine +
 "' " +
 "isn't available in Consolidate.js"
 )
 )
 }

 // allow passing options to the template preprocessor via `template` option
 const vueOptions = loadOptions(opt.optionsId)
 if (vueOptions.template) {
 Object.assign(opt, vueOptions.template)
 }

 // for relative includes
 opt.filename = this.resourcePath

 cons[opt.engine].render(content, opt, (err, html) => {
 if (err) {
 return callback(err)
 }
 callback(null, html)
 })
}

可以看到,使用consolidate 進行預處理。

v15 及以上版本,允許對vue組件中的每個部分使用其他的webpack loader,可以正常使用各種模板引擎。

使用@vue/component-compiler-utils 工具編譯模板,實際在component-compiler-utils中編譯template時,也把consolidate作為預處理器,使用consolidate.render編譯成字符串。

2. 引入pug

需安裝pug-plain-loader,利用它返回一個編譯好的 HTML 字符串,

在最新的vue-cli@3.x 配置中,默認已配置好pug的相關loader, 所以安裝完可以直接在<template/>中使用,

/* config.module.rule('pug') */
 {
 test: /\.pug$/,
 oneOf: [
 /* config.module.rule('pug').oneOf('pug-vue') */
 {
 resourceQuery: /vue/,
 use: [
 /* config.module.rule('pug').oneOf('pug-vue').use('pug-plain-loader') */
 {
 loader: 'pug-plain-loader'
 }
 ]
 },
 /* config.module.rule('pug').oneOf('pug-template') */
 {
 use: [
 /* config.module.rule('pug').oneOf('pug-template').use('raw') */
 {
 loader: 'raw-loader'
 },
 /* config.module.rule('pug').oneOf('pug-template').use('pug-plain') */
 {
 loader: 'pug-plain-loader'
 }
 ]
 }
 ]
 },

3. 引入dotjs或其他模板引擎,

需在vue.confg.js 里面手動配置loader, 配置規則跟引入pug類似,修改相關loader即可。

還有一點比較特殊,該模板引擎對應的loader, 必須返回字符串,

比如我們使用dotjs-loader,來解析dotjs模板,就會報錯,然后查看dotjs-loader,發現

return 'export default ' + doT.template(source);

最后返回導出結果, doT.template(source)執行成功后,返回一個匿名函數,

所以想要返回最終的字符串,只有傳入數據,執行函數 doT.template(source)(data)。

直接使用dotjs-loader無法達到上面的要求,只有修改loader中的返回格式,具體可以參考pug-plain-loader, 邏輯比較簡單,傳入模板引擎相關參數,options對應webpack 配置中的options參數,最后返回編譯后的字符串。

const pug = require('pug')
const loaderUtils = require('loader-utils')

module.exports = function (source) {
 const options = Object.assign({
 filename: this.resourcePath,
 doctype: 'html',
 compileDebug: this.debug || false
 }, loaderUtils.getOptions(this))

 const template = pug.compile(source, options)
 template.dependencies.forEach(this.addDependency)
 return template(options.data || {})
}

這里可以發現問題,上面代碼中options.data只是在webpack配置時傳入的,并不是正式的下發數據,使用預處理模板引擎,為了返回字符串,編譯函數執行在loader中進行,沒有辦法傳入數據data,參與編譯。

而且模板引擎的相關語法,不能與vue 的模板語法沖突,這樣會導致js模板引擎解析后,再進行vue 模板解析時報錯

如果只是純靜態頁面,可以直接把需要經過模板引擎編譯的內容部分抽離出去,使用require引入時,webpack會自動對應loader,解析完成后,只需在當前組件中傳入data,通過v-html把生成的字符串當成HTML標簽解析后輸出。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

vue-loader中引入模板預處理器的實現

vue-loader中引入模板預處理器的實現:vue-loader 是一個 webpack 的 loader,可以將指定格式編寫的 Vue 組件轉換為 JavaScript模塊 同時,vue-loader 支持使用非默認語言,通過設置語言塊的lang屬性,就可以使用指定的預處理器,比如最常見的sass 語法: <style lang=
推薦度:
標簽: VUE 使用的 模板
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产欧美日韩第一页 | 久久伊人网站 | 久久91精品久久91综合 | 欧美日韩在线一区 | 麻豆国产成人精品午夜视频 | 久久久国产精品视频 | 免费一级a毛片在线播放视 免费一区二区 | 国产精品大全国产精品 | 国产h片在线观看 | 久久国内 | 福利视频一区二区三区 | 久久婷婷色一区二区三区 | 国产丝袜美女一区二区三区 | 国产精品观看 | 国产精品视频免费看 | 日本不卡一区二区三区 最新 | 欧美日韩在线观看一区二区 | 国产成人一区在线播放 | 久久久性| 精品二区 | 国产一区精品在线观看 | 欧美日韩大尺码免费专区 | 欧美日韩亚洲综合 | 国产成人精品一区二三区2022 | 黄色在线观看网站 | 日韩精品123| 成人日韩在线 | 欧美激情国产日韩精品一区18 | 国产亚洲第一页 | 精品一区视频 | 成人欧美一区二区三区在线 | 视频一区二区三区欧美日韩 | 韩日视频在线观看 | 日韩欧美在线第一页 | 精品国产一区二区三区不卡蜜臂 | 五月激情综合网 | 91福利一区二区 | 免费一看一级毛片 | 另类一区二区 | 日本欧美韩国专区 | 免费一看一级毛片人 |