最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue-loader中引入模板預處理器的實現(xiàn)

 更新時間:2019年09月04日 09:06:50   作者:不可能的是  
這篇文章主要介紹了vue-loader中引入模板預處理器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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, 配置規(guī)則跟引入pug類似,修改相關loader即可。

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

比如我們使用dotjs-loader,來解析dotjs模板,就會報錯,然后查看dotjs-loader,發(fā)現(xiàn)

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

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

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

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

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 || {})
}

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解決vue修改數(shù)據(jù)頁面不重新渲染問題

    解決vue修改數(shù)據(jù)頁面不重新渲染問題

    這篇文章詳細介紹了vue渲染機制和如何解決數(shù)據(jù)修改頁面不刷新問題的多種方法,想了解更多的小伙伴可以借鑒閱讀
    2023-03-03
  • Vue實現(xiàn)固定定位圖標滑動隱藏效果

    Vue實現(xiàn)固定定位圖標滑動隱藏效果

    移動端頁面,有時候會出現(xiàn)一些固定定位在底部圖標,比如購物車等。這篇文章主要介紹了Vue制作固定定位圖標滑動隱藏效果,需要的朋友可以參考下
    2019-05-05
  • 使用Vue CLI創(chuàng)建typescript項目的方法

    使用Vue CLI創(chuàng)建typescript項目的方法

    這篇文章主要介紹了使用Vue CLI創(chuàng)建typescript項目的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Vue中多個元素、組件的過渡及列表過渡的方法示例

    Vue中多個元素、組件的過渡及列表過渡的方法示例

    這篇文章主要介紹了Vue中多個元素、組件的過渡及列表過渡的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • vue2.0 如何在hash模式下實現(xiàn)微信分享

    vue2.0 如何在hash模式下實現(xiàn)微信分享

    這篇文章主要介紹了vue2.0 如何在hash模式下實現(xiàn)微信分享,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • IDEA安裝vue插件圖文詳解

    IDEA安裝vue插件圖文詳解

    這篇文章主要為大家詳細介紹了IDEA安裝vue插件圖文,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • element-ui upload組件多文件上傳的示例代碼

    element-ui upload組件多文件上傳的示例代碼

    這篇文章主要介紹了element-ui upload組件多文件上傳的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • VUE學習之Element-ui文件上傳實例詳解

    VUE學習之Element-ui文件上傳實例詳解

    今天進行了element?文件上傳組件的運用,寫一下心得,下面這篇文章主要給大家介紹了關于VUE學習之Element-ui文件上傳的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • Vue關于對象直接賦值的坑及解決

    Vue關于對象直接賦值的坑及解決

    這篇文章主要介紹了Vue關于對象直接賦值的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue項目中最新用到的一些實用小技巧

    Vue項目中最新用到的一些實用小技巧

    這篇文章主要給大家介紹了關于Vue項目中最新用到的一些實用小技巧,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11

最新評論

介休市| 八宿县| 宜章县| 三明市| 台南县| 平安县| 吉隆县| 阜康市| 巫山县| 靖安县| 即墨市| 朝阳县| 清苑县| 绥阳县| 梅州市| 宁安市| 禄丰县| 漳平市| 大化| 桑日县| 望城县| 二连浩特市| 皋兰县| 吉木萨尔县| 手游| 西林县| 南召县| 康保县| 宣武区| 绥化市| 共和县| 磐石市| 夏邑县| 清涧县| 芜湖市| 通江县| 吐鲁番市| 兴仁县| 大宁县| 兴山县| 项城市|