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コードは正しくありません(詳細な調査についてはコメントを参照してください)。


数日前、TypeScriptとAMD(UMD)のバグ

@ yyx990803から回答を得ましたが、私はJSの最初から
そして、私が今それを手に入れれば、問題はまだ関連しています。

エヴァンは私に答えました:

「vue」モジュールが自分で含めたvue.jsUMDビルドを指すように構成に何もないようです。 そのため、TSコンパイラはnode_modules / vueからそれを解決し、CommonJSビルドであるpackage.jsonの「main」フィールドを使用しています。 tsconfigでcompilerOptions.pathsを使用してマッピングを指定する必要があります。

したがって、私がEvanを正しく理解した場合、彼はRequireJSが間違ったvue.jsファイルをダウンロードすると考えました。
正しいものはUMD / AMDモジュールシステム用ですが、TSコンパイラはCommonJSモジュールシステム用のvue.jsファイルへの参照を作成します。 これが私がエラーを受け取った理由です。

しかし、それは正しくありません。 TSコンパイラは参照するだけです

私のサイト/

私の場合は次のとおりです。

mySite / 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,
        ...
    },
    ...
}

esModuleInteroptrueに設定すると、出力には__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の類似点の1つは、どちらもTypeScript baseUrlオプションを使用していることです。 TypeScriptの標準インポートに間違いなく問題があります。

私もVue2.5.13を使用しています。 Node8.9.3とTypeScript2.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,
        ...
    },
    ...
}

esModuleInteroptrueに設定すると、出力には__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 評価