TypeScript ES динамический `import()`
При использовании новой функции TypeScript, так называемого ES Dynamic Imports, я не могу запустить код моего изоморфного приложения на стороне сервера, используя ts-node
,
Кажется, что ошибка не возникает при использовании загрузчика модуля webpack, который переносит код по-своему и запускает полученные файлы в браузере.
Ошибка, которую я получил:
case 0: return [4 /*yield*/, import("./component/main")];
^^^^^^
SyntaxError: Unexpected token import
Обычно TypeScript переносит import
выражение чего-то подобного: Promise.resolve(require("./component/main"))
Но я не могу видеть это там.
Как это исправить? Есть ли что-то общее с ts-node
? Или есть "полифилл" для node.js
?
мой tsconfig.json
файл:
{
"compilerOptions": {
"declaration": false,
"emitDecoratorMetadata": true,
"allowJs": false,
"experimentalDecorators": true,
"importHelpers": true,
"inlineSourceMap": false,
"inlineSources": false,
"lib": [
"DOM",
"ES5",
"ES6",
"ES7"
],
"listFiles": false,
"module": "commonjs",
"noEmitOnError": true,
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"preserveConstEnums": false,
"pretty": false,
"removeComments": false,
"strict": true,
"target": "es5"
}
}
код:
import * as m from "mithril";
import LayoutComponent from "./component/layout";
const render = (
layout: m.ComponentTypes<any, any>,
) => ({ tag, attrs }: m.Vnode<any, any>) => m(layout, attrs, m(tag as any, attrs));
export default {
"/:path...": {
onmatch: async (args, path) => (await import("./component/main")).default,
render: render(LayoutComponent),
},
} as m.RouteDefs;
1 ответ
Это ошибка в компиляторе Typescript, которая будет исправлена в 2.5.
Экспорт объекта по умолчанию с помощью функции, которая импортирует файл , не скомпилирует import
заявление в require
утверждение в Typescript 2.4.x.
Например, пока это:
export const sudo = { run() { return import('./test3'); } }
Скомпилируем к этому:
exports.sudo = { run: function () { return Promise.resolve().then(function () { return require('./test3'); }); } };
Это:
export default { run() { return import('./test3'); } }
Компилируется в это:
exports.default = { run: function () { return import('./test3'); } };
Что явно не так. Временное решение будет следующим:
export const sudo = { run() { return import('./test3'); } }
export default sudo;
Что компилирует (правильно) в это:
exports.sudo = { run: function () { return Promise.resolve().then(function () { return require('./test3'); }); } };
exports.default = exports.sudo;