Vue: TypeScript 和 AMD (UMD) 生成的 JS 代码错误 - 版本 2

创建于 2018-01-04  ·  3评论  ·  资料来源: vuejs/vue

版本

2.5.13

转载链接

https://github.com/80LevelElf/VueProblemApp

重现步骤

只需打开应用程序即可
/VueProblemApp/VueProblemApp/index.html 文件,您将在控制台中看到错误。

什么是预期?

Typescript 编译器应该采用 Vue 类型并生成正确的代码。

实际发生了什么?

生成的 JS 代码不正确(详细说明见注释)。


几天前我创建了错误生成的 JS 代码 by TypeScript 和 AMD (UMD)错误(点击链接查看问题的详细解释)。

我从@yyx990803得到了答案,但我是 JS 的
如果我现在明白了,这个问题仍然是相关的。

埃文回答我:

您的配置中似乎没有任何内容将“vue”模块指向您自己包含的 vue.js UMD 构建。 所以 TS 编译器正在从 node_modules/vue 解析它,并使用 package.json 中的“main”字段,这是一个 CommonJS 构建。 您需要在 tsconfig 中使用 compilerOptions.paths 指定映射。

所以如果我猜对了 Evan,他认为 RequireJS 下载了错误的 vue.js 文件。
正确的是UMD/AMD模块系统,但是TS编译器引用了CommonJS模块系统的vue.js文件。 这就是我收到错误的原因。

但这是不对的。 TS编译器只是参考

我的网站/

就我而言,它是:

我的网站/vue.js

无论 vue.js 文件是什么。 所以如果这个链接里没有 vue.js 就会出现 404 错误。

另外,我尝试像这样更改 node_modules/vue/package.json 中的主要配置: "main": "dist/vue.js" 它给了我同样的错误。

我检查了 RequireJS 加载的 vue.js 文件,它是正确的文件。 RequireJS 解析正确,问题出在类型上。

此外,如果我像这样进行导入(如提供的@Micene09 ):

import { Vue } from "vue-property-decorator";

在 mySite/vue.js 中加载相同的 vue.js 文件一切正常。
所以如果我说对了,问题仍然存在。

最有用的评论

我遇到了同样的问题。

根据我的理解,vue.js 文件应该像 vue-class-component 一样设置exports.default变量。

vue-class-component.js(第 192 行):
exports['default'] = Component$1;

vue-class-component 文件有一个特殊情况来处理 Vue 缺少的默认导出,这就是它起作用的原因。

vue-class-component.js(第 12 行):
Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;

不幸的是,TypeScript 2.5 编译器没有输出处理缺失默认值的特殊情况。 但是, TypeScript 2.7有一个新选项 ( esModuleInterop ) 可以解决这个问题。

{
    "compilerOptions": {
        "module": "amd",
        "esModuleInterop": true,
        ...
    },
    ...
}

esModuleInterop设置为true ,输出包含一个名为__importDefault的函数,该函数正确处理缺少的默认属性。

var __importDefault = (this && this.__importDefault) || function (mod) {
  return (mod && mod.__esModule) ? mod : { "default": mod };
}
define(["require", "exports", "vue"], function (require, exports, vue_1) {
  "use strict";
  Object.defineProperty(exports, "__esModule", { value: true });
  vue_1 = __importDefault(vue_1);
  var app = new vue_1.default({
        ...
  });
});

所有3条评论

对不起,但这对于一个不应在问题中解决的非常具体的设置来说确实是一个超出范围的问题。 问题仅针对源自 Vue 本身的错误报告。

@80LevelElf——我通过执行以下操作(

import { VueConstructor } from "vue";
const Vue = require("vue") as VueConstructor;  // cast as VueConstructor to get typings. 

const app = new Vue({
  template: "<h1>Hello World</h1>
});

@yyx990803——我处于类似但不同的情况。 我正在使用 TypeScript 的commonjs输出(没有 webpack)。 OP 和 I 之间的一个相似之处是我们都使用 TypeScript baseUrl选项。 TypeScript 中的标准导入肯定有问题。

我也在使用 Vue 2.5.13。 我正在 Node 8.9.3 和 TypeScript 2.6 上设置 SSR。 我的tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "outDir": "build",
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "rootDir": "./src",
    "baseUrl": "./src",
    "noUnusedLocals": true
  },
  "exclude": [
    "node_modules",
    "typings"
  ]
}

我尝试了许多其他解决方法,包括尝试通过compilerOptions.paths属性加载 vue.esm.js 文件,但没有成功。 我得到了与 OP 完全相同的vue_1.default is not a constructor错误。

我在这里复制了一个副本打开了一个新问题

我遇到了同样的问题。

根据我的理解,vue.js 文件应该像 vue-class-component 一样设置exports.default变量。

vue-class-component.js(第 192 行):
exports['default'] = Component$1;

vue-class-component 文件有一个特殊情况来处理 Vue 缺少的默认导出,这就是它起作用的原因。

vue-class-component.js(第 12 行):
Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;

不幸的是,TypeScript 2.5 编译器没有输出处理缺失默认值的特殊情况。 但是, TypeScript 2.7有一个新选项 ( esModuleInterop ) 可以解决这个问题。

{
    "compilerOptions": {
        "module": "amd",
        "esModuleInterop": true,
        ...
    },
    ...
}

esModuleInterop设置为true ,输出包含一个名为__importDefault的函数,该函数正确处理缺少的默认属性。

var __importDefault = (this && this.__importDefault) || function (mod) {
  return (mod && mod.__esModule) ? mod : { "default": mod };
}
define(["require", "exports", "vue"], function (require, exports, vue_1) {
  "use strict";
  Object.defineProperty(exports, "__esModule", { value: true });
  vue_1 = __importDefault(vue_1);
  var app = new vue_1.default({
        ...
  });
});
此页面是否有帮助?
0 / 5 - 0 等级