2017-07-29 86 views
4

在使用新的TypeScript功能(所谓的ES Dynamic Imports)时,我无法使用ts-node在服务器端运行我的同构应用程序的代码。TypeScript ES dynamic`import()`

当使用webpack模块加载器,它以自己的方式传输代码并在浏览器中运行生成的文件时,似乎不会发生错误。

我已经得到了错误:

case 0: return [4 /*yield*/, import("./component/main")]; 
          ^^^^^^ 
SyntaxError: Unexpected token import 

通常打字稿transpiles的import表达类似的东西:Promise.resolve(require("./component/main")),但我看不到它。

如何解决这个问题?它与ts-node有什么共同点?或者node.js有一个“polyfill”?

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

为了得到这个工作,我必须明确地传递了'--compiler'参数TS-节点。使它使用正确版本的打字稿。 –

+0

我会尝试,所以它不使用项目的默认/安装在node_modules? – Roomy

+1

它没有工作,对不起 – Roomy

回答

3

这是打字稿编译器将被固定在一个2.5bug

导出与导入文件的功能默认对象不会编译import声明成require声明在打字稿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; 
+0

好吧,换句话说,我不得不使用Promise代替异步/等待? 'import(...)。then((cmp)=> cmp.default)'应该这样做,我正确吗? – Roomy

+2

否;您不得不导出非默认对象,然后导出默认对象。异步/等待将仍然有效(afaik,我可以继续尝试) –

+0

是的,你是对的,我不能使用该语法,感谢解释 – Roomy