2.5.13
https://github.com/80LevelElf/VueProblemApp
ما عليك سوى تشغيل التطبيق عن طريق فتح ملف
/VueProblemApp/VueProblemApp/index.html الملف وسترى الخطأ في وحدة التحكم.
يجب أن يأخذ برنامج التحويل البرمجي Typescript كتابات Vue وينتج الكود الصحيح.
رمز JS الناتج غير صحيح (انظر التعليقات للحصول على شرح تفصيلي).
منذ عدة أيام ، قمت بإنشاء رمز JS الذي تم إنشاؤه بشكل
حصلت على إجابة من @ yyx990803 ، لكنني
وإذا حصلت عليها الآن ، فإن المشكلة لا تزال ذات صلة.
أجابني إيفان:
يبدو أنه لا يوجد شيء في التكوين الخاص بك يوجه وحدة "vue" إلى vue.js UMD الذي قمت بتضمينه بنفسك. لذلك يقوم مترجم TS بحله من node_modules / vue ويستخدم الحقل "main" في package.json ، وهو بناء CommonJS. تحتاج إلى تحديد التعيين باستخدام compilerOptions.paths في ملف tsconfig الخاص بك.
لذا ، إذا فهمت إيفان بشكل صحيح ، فقد اعتقد أن RequireJS يقوم بتنزيل ملف vue.js الخاطئ.
الخيار الصحيح هو لنظام الوحدة النمطية UMD / AMD ، لكن مترجم TS يشير إلى ملف vue.js لنظام الوحدة النمطية CommonJS. هذا هو السبب في أنني حصلت على الخطأ.
لكن هذا ليس صحيحًا. مترجم TS فقط قم بالإشارة إلى
موقعي/
وفي حالتي هو:
mySite / vue.js
بغض النظر عن ملف vue.js. لذلك إذا لم يكن هناك vue.js في هذا الرابط ، فسيكون هناك خطأ 404.
أيضًا ، أحاول تغيير التكوين الرئيسي في node_modules / vue / package.json مثل هذا: "main": "dist / vue.js" ويعطيني نفس الخطأ.
لقد تحققت من ملف vue.js الذي يتم تحميله بواسطة RequireJS وهو الملف الصحيح . RequireJS تحليله بشكل صحيح ، المشكلة تكمن في الكتابة.
أيضًا إذا قمت بإجراء الاستيراد مثل هذا (مثل @ Micene09 المقدم):
import { Vue } from "vue-property-decorator";
كل شيء يعمل بشكل جيد مع تحميل نفس ملف vue.js في mySite / vue.js.
لذلك إذا فهمتك بشكل صحيح ، فستظل المشكلة قائمة.
أنا آسف ، لكن هذا في الحقيقة سؤال خارج النطاق لإعداد محدد جدًا لا ينبغي حله في المشكلات. المشكلات تتعلق بتقارير الأخطاء التي تنشأ من 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 - أنا في وضع مماثل ، لكن مختلف. أنا أستخدم إخراج commonjs
من TypeScript (بدون حزمة ويب). أحد أوجه التشابه بين OP و I هو أننا نستخدم الخيار TypeScript baseUrl
. هناك شيء خاطئ بالتأكيد في الاستيراد القياسي في TypeScript.
أنا أيضًا أستخدم Vue 2.5.13. أقوم بإعداد SSR على Node 8.9.3 و TypeScript 2.6. يبدو 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"
]
}
لقد جربت عددًا من الحلول الأخرى ، بما في ذلك محاولة تحميل ملف vue.esm.js عبر خاصية compilerOptions.paths
، ولكن دون جدوى. كنت أتلقى نفس الخطأ vue_1.default is not a constructor
مثل OP.
واجهتني نفس المشكلة.
من وجهة نظري ، يجب أن يقوم ملف vue.js بتعيين المتغير exports.default
كما يفعل مكون vue-class.
vue-class-component.js (السطر 192):
exports['default'] = Component$1;
يحتوي ملف مكون فئة vue على حالة خاصة للتعامل مع التصدير الافتراضي المفقود من 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({
...
});
});
التعليق الأكثر فائدة
واجهتني نفس المشكلة.
من وجهة نظري ، يجب أن يقوم ملف vue.js بتعيين المتغير
exports.default
كما يفعل مكون vue-class.vue-class-component.js (السطر 192):
exports['default'] = Component$1;
يحتوي ملف مكون فئة vue على حالة خاصة للتعامل مع التصدير الافتراضي المفقود من Vue ، وهذا هو سبب نجاحه.
vue-class-component.js (السطر 12):
Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;
لسوء الحظ ، لا يقوم برنامج التحويل البرمجي TypeScript 2.5 بإخراج حالة خاصة للتعامل مع الوضع الافتراضي المفقود. ومع ذلك ، يحتوي TypeScript 2.7 على خيار جديد (
esModuleInterop
) يعمل على إصلاح هذه المشكلة.مع تعيين
esModuleInterop
علىtrue
، يحتوي الناتج على دالة تسمى__importDefault
، والتي تعالج الخاصية الافتراضية المفقودة بشكل صحيح.