深入理解 Vue 不同構建版本的區別

目錄

1、Vue 的兩個不同版本的介紹

2、運行時+編譯器 vs 只包含運行時

3、template 和 render() 的使用區別

4、兩種不同的構建版本的具體使用

5、用 codesandbox.io 寫 Vue 代碼


1、Vue 的兩個不同版本的介紹

首先你要了解如何創建一個 Vue 項目,如果你還不熟悉的話,可以移步到這裏:傳送門。創建 Vue 項目的過程中會涉及到 Vue 兩個不同版本的選擇:(1)完整版:vue.js、(2)只包含運行時版:vue.runtime.js 下面說一下它們之間的差異:

  • 完整版:同時包含編譯器和運行時的版本(compiler + runtime)。
  • 編譯器:用來將模板字符串編譯成爲 JavaScript 渲染函數的代碼(compiler)。
  • 運行時:用來創建 Vue 實例、渲染並處理虛擬 DOM 等的代碼。基本上就是除去編譯器的其它一切(runtime)。
  Vue 完整版 Vue非完整版 描述
特點 有 compiler 編譯器 沒有 compiler 編譯器 compiler 佔 40% 體積
視圖 寫在 HTML 文件或 template 選項中 寫在 render 函數裏,用 h 函數來創建標籤 h 是尤雨溪寫好傳給 render 的
cdn 引入 vue.js vue.runtime.js 文件名不同,生成環境後綴爲 .min.js
webpack 引入 需要配置 alias 默認使用此版 別問,尤雨溪配置的
@vue/cli 引入 需要額外配置 默認使用此版 別問,尤雨溪、蔣豪羣配置的

推薦使用 vue.runtime.js 非完整版,然後配合 vue-loader 和 vue 文件思路,這樣可以保證用戶體驗,用戶下載的 JS 文件體積更小,但只支持 h 函數。而且可以保證開發體驗,開發者可直接在 vue 文件裏寫 HTML 標籤,而不寫 h 函數,多餘的工作讓 loader 做,vue-loader 把 vue 文件裏的 HTML 轉爲 h 函數。

2、運行時+編譯器 vs 只包含運行時

如果你需要在客戶端編譯模板 (比如傳入一個字符串給 template 選項,或掛載到一個元素上並以其 DOM 內部的 HTML 作爲模板),就將需要加上編譯器,即完整版:

// 需要編譯器
new Vue({
  template: '<div>{{ hi }}</div>'
})

// 不需要編譯器
new Vue({
  render (h) {
    return h('div', this.hi)
  }
})

當使用 vue-loader 或 vueify 的時候,*.vue 文件內部的模板會在構建時預編譯成 JavaScript。你在最終打好的包裏實際上是不需要編譯器的,所以只用運行時版本即可。

因爲運行時版本相比完整版體積要小大約 30%,所以應該儘可能使用這個版本。如果你仍然希望使用完整版,則需要在打包工具裏配置一個別名,詳情移步:傳送門

3、template 和 render() 的使用區別

在 Vue 完整版 vue.js 下可以使用 template 選項,因爲其內置 compiler 編譯器,可以將 template 字符串編譯成 h 函數,從而達到直接從 HTML 渲染視圖的效果。如果是在 Vue 非完整版 vue.runtime.js 下就只能使用 render 的 h 函數,通過 JS 構建的方法來達到渲染視圖的效果。

//完整版 - 需要 compiler 編譯器 - 編譯 template
new Vue({    //這個vue實例封裝了一些東西,類似jQuery封裝的 return api
  el:'#app', //el代表渲染掛在節點,會被替換,同$mount('#app')    //涉及到 SEO 友好、服務端渲染
  data:{ num:0 }                      //完整版支持從html中獲取視圖
  template: '<div>{{ num }}</div>'    //template內容可以寫在html文件中,完整版都支持
})

//運行時版 - 不需要 compiler 編譯器 - 只能使用 h 函數
new Vue({    //這個vue實例封裝了一些東西,類似jQuery封裝的 return api
  render (h) {    //不支持template選項或從html中獲取視圖
    return h('div', this.num)    //可以將 h 函數類別成 createElement()
  }
})

補充,運行時版通過 render 和 h 函數來創建視圖,看似麻煩,但是這種方式是比較提倡的,這也就是爲什麼在 使用 webpack 引入  @vue/cli 引入時 默認使用此版本,那麼具體原因是什麼呢?

我們知道完整版使用 運行時 vue.runtime.js + 編譯器 compiler 組合的形式,支持直接將寫在 template 或 html 文件中的字符串編譯成 dom 節點,非完整版只有運行時 vue.runtime.js,不支持上述編譯,但實際上非完整版有一個 預編譯的 loader 加載器,使用 vue.runtime.js 非完整版,然後配合 vue-loader 可以將寫在 vue 文件中的 HTML 標籤轉義爲 h 函數,實現預編譯的功能。

使用 vue.runtime.js 非完整版配合 vue-loader 可以保證用戶體驗,用戶下載的 JS 文件體積更小,但只支持 h 函數。而且可以保證開發體驗,開發者可直接在 vue 文件裏寫 HTML 標籤,而不寫 h 函數,多餘的工作讓 loader 做,vue-loader 把 vue 文件裏的 HTML 轉爲 h 函數。

4、兩種不同的構建版本的具體使用

現在我們分別使用 Vue 兩種不同版本的構建工具實現一個點擊按鈕數字加一的功能,來具體看一下兩種版本的實現方式:

(1)使用完整版(vue.runtime.js + compiler)支持將 template 選項或 html 文件中的代碼直接編譯成頁面的 dom 節點。

<div id="app"></div>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
  var app = new Vue({
    el: "#app",
    template: `<div>{{ num }} <button @click="increment">+1</button></div>`,
    data: {
      number: 0
    },
    methods: {
      incremente() {
        this.num ++;
      }
    }
  });
</script>

(2)僅使用運行時版(vue.runtime.js )可以實現同樣的效果,但是項目體積會更小,但是這對開發人員不友好。

<div id="app"></div>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.runtime.js"></script>
<script>
  var app = new Vue({
    el: "#app",
    data: { num: 0 },
    methods: {
      increment() {
        this.num ++;
      }
    },
    render(createElement) {
      return createElement("div", [
        this.num,
        createElement("button",{ on: { click: this.increment } }, "+1")
      ]);
    }
  });
</script>

兩種方式的優缺點:第一種完整版的方式對開發人員友好,html 可以直接寫到 template 或 html 文件中,完整版可以通過編譯器直接將其渲染成頁面給上的 dom 節點,但是較運行時版體積較大。第二種運行時版的方式對開發人員不友好,但是項目體積較少。

爲應對上述問題,可以將 運行時版結合 vue-loader + *vue文件 的方式,可以將寫在 vue 文件中的 html 預先轉化爲 h 函數的形式,這樣即可以滿足項目體積小用戶體驗好,又可以滿足開發人員直接寫 html 的兩種需求,完美!

5、用 codesandbox.io 寫 Vue 代碼

如果你需要在新的環境,或在其他接觸不到你自己電腦的環境下開發,推薦使用 CodeSandBox 進行在線開發。

CodeSandbox 是一個爲 Web 應用程序開發而構建的在線編輯器,這個網站內置了多種 Web 開發框架的編譯及運行配置,使得開發人員不需要進行繁瑣的項目配置就可以着手進行開發工作,從而更好的專注於編寫代碼。CodeSandbox  彷彿就是一個在線的 webstorm 編譯器,並且還給你設置好了所有開發前的準備配置,它還支持以 zip 的形式導出你的項目,趕快去試試吧 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章