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

.vue文件編譯成瀏覽器可執(zhí)行文件的流程詳解

 更新時間:2023年09月01日 09:36:20   作者:九殤  
這篇文章主要給大家介紹了.vue?文件是如何編譯成瀏覽器可執(zhí)行的文件,文中通過代碼示例將編譯流程介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的價值,感興趣的同學(xué)可以參考閱讀下

vue2官網(wǎng) 其中”安裝”介紹了關(guān)于Vue的各種版本。

  • 編譯器:用來將模板字符串編譯成為 JavaScript 渲染函數(shù)的代碼。
<div id="app">
    <div>{{ a }}</div> 
</div> 
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script> <script> 
const vm = new Vue({ el: '#app', data: { a: 'hello world', }, }) 
</script>

以上是一段簡單的Vue2代碼, 打開瀏覽器可以正確顯示出 “hello world”,- 可以發(fā)現(xiàn) <div>{{ a }}</div> 不是瀏覽器支持的語法. 所以實際上能顯示 hello world, 并不是由以上模板代碼直接在瀏覽器執(zhí)行的結(jié)果, 而是通過”編譯器”編譯, 再由瀏覽器執(zhí)行

  • 接下來用代碼為大家演示Vue2是如何將上面代碼編譯的
  • 首先必須引入”完整版”,
  • 打開頁面, 在控制臺可以發(fā)現(xiàn)方法: Vue.compile

  • 將剛才的 template 代碼放到編譯方法里執(zhí)行, 結(jié)果如下

  • 可以看到 template 被編譯成 JavaScript,_c,_v,_s,是vue實例vm上一些方法的簡稱

  • 編譯結(jié)果可以翻譯成
<script>
    const vm = new Vue({
      el: '#app',
      name: 'App',
      data: () => ({
        a: 'hello world!!!',
      }),
      render() {
        const {_c, _v, _s, a} = this
        //return createElement('div', [createTextNode(toString(a))])
        return  _c('div',[_v(_s(a))])
      }
  })
  </script>

這樣 模板template就被編譯為了 render函數(shù)

  • 以上便是在 .html 文件中使用template 開發(fā), 由 Vue2完整版 進(jìn)行編譯的過程

.vue文件是如何進(jìn)行編譯的?

通常項目中是使用Webpack打包, 再由瀏覽器引入這些js, css等文件, 那么Webpack是如何對.vue文件進(jìn)行編譯的?

1. .vue文件

.vue文件,.vue 文件是一個自定義的文件類型,用類 HTML 語法描述一個 Vue 組件。每個 .vue 文件包含三種類型的頂級語言塊 <template>、<script> 和 <style>,還允許添加可選的自定義塊.

2. vue-loader

vue-loader 會解析文件,提取每個語言塊,如有必要會通過其它 loader 處理,最后將他們組裝成一個 ES Module,它的默認(rèn)導(dǎo)出是一個 Vue.js 組件選項的對象。

接下來通過vue-loader的源碼來了解是如何實現(xiàn)編譯的

vue-loader/src/index.ts

vue文件分為 template, script, style 三個部分, 而實際必須通過編譯才能在瀏覽器執(zhí)行的部分只有template, 所以我們在看 vue-loader 源碼時可以重點關(guān)注 “template” 關(guān)鍵詞

descriptor.template 如上圖所示, 在源碼搜索 template 關(guān)鍵字可以找到這段處理 script, template, style 的代碼, 仔細(xì)觀察發(fā)現(xiàn)這三段都在用 descriptor 對象, 接下來搜索 descriptor, 找到這個變量在哪里生成的 descriptor

再來找 parse 方法

compiler.ts compiler.ts

parse 方法從 vue/compiler-sfc 中引用

至此, 了解到 vue-loader 是通過 @vue/compiler-sfc 的 parse 方法解析 .vue 文件, 從中解析出script, template, style

@vue/compiler-sfc

用一段nodejs代碼進(jìn)行驗證

// App.vue
<template>
  <div id="app">
    <div>{{ a }}</div>
    <input type="text" v-model="a">
  </div>
</template>
<script>
export default {
  name: 'App',
  data: () => ({
    a: 'hello world'
  }),
}
</script>
// build.js
const { parse } = require('@vue/compiler-sfc')
const fs = require('fs')
const data = fs.readFileSync('./App.vue')
const { descriptor } = parse(data.toString())
// 結(jié)果包含很多項, 本文檔中只展示重點字段
console.log(Object.keys(descriptor))

運行 build.js

[
  'styles',
	'template',
  'script',
  // ...
]

通過以上代碼可以解析出 .vue 文件的三部分, 接下來開始解析 template vue-template-compiler vue-template-compiler 可以將 template 編譯成 Javascript

  • 繼續(xù)修改 build.js, 根據(jù)文檔加上 compile 的部分
// build.js
const { parse } = require('@vue/compiler-sfc')
const fs = require('fs')
const compiler = require('vue-template-compiler')
const data = fs.readFileSync('./App.vue')
const { descriptor } = parse(data.toString())
// console.log(Object.keys(descriptor))
console.log(compiler.compile(descriptor.template.content).render)
  • 運行結(jié)果如下
with(this){
  return _c(
    'div',
    {attrs:{"id":"app"}},
    [
      _c('div',[_v(_s(a))]),
      _v(" "),
      _c(
        'input',
        {
          directives:[{name:"model",rawName:"v-model",value:(a),expression:"a"}],
          attrs:{"type":"text"},
          domProps:{"value":(a)},
          on:{
            "input": function($event){
              if($event.target.composing) return;
              a=$event.target.value
            }
          }
        }
      )
    ]
  )
}

再將以上代碼放到 .html 的 new Vue(...) 方法中進(jìn)行驗證

<div id="app"/>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
  const vm = new Vue({
    name: 'App',
    data: () => ({
      a: 'hello world!!!',
    }),
    render() {
      const {_c, _v, _s, a} = this
      return _c(
        'div',
        {attrs: {'id': 'app'}},
        [
          _c('div', [_v(_s(a))]),
          _v(' '),
          _c(
            'input',
            {
              directives: [{name: 'model', rawName: 'v-model', value: (a), expression: 'a'}],
              attrs: {'type': 'text'},
              domProps: {'value': (a)},
              on: {
								// 注意這里的 this, 需要改成箭頭函數(shù)
                'input': ($event) => {
                  if ($event.target.composing) return
                  this.a = $event.target.value
                },
              },
            },
          ),
        ],
      )
    },
  }).$mount('#app')
</script>

以上便是 Webpack 如何將 .vue 文件編譯成瀏覽器可執(zhí)行文件的過程

到此這篇關(guān)于.vue文件編譯成瀏覽器可執(zhí)行文件的流程詳解的文章就介紹到這了,更多相關(guān).vue文件編譯成可執(zhí)行文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vuex Module將 store 分割成模塊的操作

    vuex Module將 store 分割成模塊的操作

    這篇文章主要介紹了vuex Module將 store 分割成模塊,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • vue中使用雙token機制

    vue中使用雙token機制

    雙Token機制是一種增強身份驗證安全性和提升用戶體驗的技術(shù)方案,本文主要介紹了vue中使用雙token機制,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • vue 修改vant自帶的樣式過程

    vue 修改vant自帶的樣式過程

    這篇文章主要介紹了vue 修改vant自帶的樣式過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue.js的動態(tài)組件模板的實現(xiàn)

    Vue.js的動態(tài)組件模板的實現(xiàn)

    這篇文章主要介紹了Vue.js的動態(tài)組件模板的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue3子組件上綁定(v-model="xx")父組件傳過來的值后報錯解決

    vue3子組件上綁定(v-model="xx")父組件傳過來的值后報錯解決

    這篇文章主要給大家介紹了關(guān)于vue3子組件上綁定(v-model="xx")父組件傳過來的值后報錯解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue3具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-07-07
  • vue基于Element按鈕權(quán)限實現(xiàn)方案

    vue基于Element按鈕權(quán)限實現(xiàn)方案

    這篇文章主要介紹了vue基于Element按鈕權(quán)限實現(xiàn)方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • vue vant中picker組件的使用

    vue vant中picker組件的使用

    這篇文章主要介紹了vue vant中picker組件的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue?watch監(jiān)聽觸發(fā)優(yōu)化搜索框的性能防抖節(jié)流的比較

    vue?watch監(jiān)聽觸發(fā)優(yōu)化搜索框的性能防抖節(jié)流的比較

    這篇文章主要為大家介紹了vue?watch監(jiān)聽觸發(fā)優(yōu)化搜索框的性能防抖節(jié)流的比較,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Vue3實現(xiàn)PDF文件解析與預(yù)覽的完整實踐

    Vue3實現(xiàn)PDF文件解析與預(yù)覽的完整實踐

    在實際的前端開發(fā)中,經(jīng)常會碰到需要在線預(yù)覽PDF文件的場景,比如后臺管理系統(tǒng)查看合同、教育平臺展示試卷、審批系統(tǒng)預(yù)覽發(fā)票等等,所以本文給大家介紹了Vue3實現(xiàn)PDF文件解析與預(yù)覽的完整實踐,需要的朋友可以參考下
    2025-06-06
  • vue2.0結(jié)合DataTable插件實現(xiàn)表格動態(tài)刷新的方法詳解

    vue2.0結(jié)合DataTable插件實現(xiàn)表格動態(tài)刷新的方法詳解

    這篇文章主要介紹了vue2.0結(jié)合DataTable插件實現(xiàn)表格動態(tài)刷新的方法,結(jié)合具體項目實例形式分析了vue2.0結(jié)合DataTable插件實現(xiàn)表格動態(tài)刷新過程中遇到的問題與相應(yīng)的解決方法,需要的朋友可以參考下
    2017-03-03

最新評論

都昌县| 通辽市| 北川| 大邑县| 德保县| 中宁县| 安达市| 乐清市| 富顺县| 朔州市| 米泉市| 民勤县| 平邑县| 平湖市| 枣庄市| 北川| 缙云县| 柏乡县| 伊吾县| 南投市| 龙门县| 志丹县| 喀喇沁旗| 宁化县| 高安市| 河北区| 左云县| 泸定县| 四会市| 宜章县| 荔波县| 郸城县| 衢州市| 吕梁市| 广汉市| 象山县| 盖州市| 巴青县| 禄丰县| 焦作市| 民县|