使用模板字符串预编译 TypeScript Vue 组件

Posted

技术标签:

【中文标题】使用模板字符串预编译 TypeScript Vue 组件【英文标题】:Pre-compile TypeScript Vue components with template string 【发布时间】:2017-04-09 22:55:22 【问题描述】:

我有一个使用 Webpack 构建的 Vue 站点。我有一个包含组件的 TypeScript 文件:

// my-component.ts

import Vue = require('vue');

export default Vue.component("my-component", 
    template: "<div>I am a component</div>"
);

当我尝试使用此组件时,我收到以下警告:

您正在使用仅运行时构建的 Vue,其中模板选项不可用。要么将模板预编译为渲染函数,要么使用编译器包含的构建。

现在:如何预编译此模板?我知道我可以 define a .vue file 甚至在 &lt;script&gt;&lt;/script&gt; 中使用 TypeScript,但我宁愿在纯 TypeScript 中定义我的组件,以便在 WebStorm 中获得很好的 TypeScript 支持。

这可能吗?


(我知道我也可以通过在vue/dist/vue.js 为包含编译器的构建创建别名来使用第二个选项,但我觉得这会给我带来性能损失。至少,它为我的构建增加了 20kb .)


【问题讨论】:

【参考方案1】:

您应该可以使用 standalone build 来执行此操作,只需将以下内容添加到您的 webpack 配置(这是最新的 Vue 版本):

resolve: 
  alias: 
    'vue$': 'vue/dist/vue.common.js'
  

它应该为您引入独立构建,其中包括模板选项。


如果您想尝试创建自己的render functions,那么您可以。最基本的你会得到:

Vue.component('msg', 
  functional: true,
  render: (createElement, context) => 
    return createElement('div', context.props.message)
  ,
  props: ['message']
)

它有点复杂,但如果你真的不喜欢使用.vue 文件的想法并且你的模板相对简单,那么实际上还不错,这是上述组件的小提琴:

https://jsfiddle.net/et67zqdp/

那么值得一看:

https://vuejs.org/v2/guide/render-function.html

【讨论】:

嘿,谢谢,我应该添加到我考虑过的问题中。但这可能会损害性能?除了为最终的包大小增加 30kb... 是的,有一点折衷,Vue 在运行时在standalone build 中编译模板,所以你必须接受性能损失(在大多数情况下它可能可以忽略不计) .但是,如果性能更成问题,那么您应该考虑使用 .vue 文件并编译它们。在内部,vue.vue 文件编译为适用于 runtime-only 构建的渲染函数。 编辑:似乎不可能在自己的 .js 文件中定义组件的脚本部分,然后在 .vue 文件中定义唯一的模板?因为这对我的情况来说是完美的。 vue-loader.vuejs.org/en/start/spec.html: '*.vue 文件是一种自定义文件格式,它使用类似 HTML 的语法来描述 Vue 组件。每个 *.vue 文件由三种***语言块组成: 你一直都是对的,我可以只使用一个相对文件“如果你喜欢将你的 *.vue 组件拆分成多个文件,你可以使用 src 属性导入一个语言的外部文件块:“:&lt;script src="./script.js"&gt;&lt;/script&gt; @craig_h 是的,确实是一种权衡。这导致了我们项目中的性能问题。有谁知道是否可以在 Typescript 中预编译模板而无需将所有内容都转换为 .vue 文件?【参考方案2】:

我不知道这是否可行: 但我只是在项目的根目录(你的“package.json”所在的位置)创建了一个文件,命名为

“vue.config.js”

module.exports = 
  runtimeCompiler: true

【讨论】:

我认为这更像是“要走的路”。 但这是要走的路吗?还是你只是想纠正我的语法? o.O :D 大部分只是语法错误。哈哈

以上是关于使用模板字符串预编译 TypeScript Vue 组件的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeScript 编译 Vue 时出错

underscore.js 预编译模板使用

如何编译时检查 vue 模板中的强类型道具?

在Electron的预装脚本中使用typescript

vue 答案

vue-type-check: Vue 模板中的 Typescript 类型检查