如何在打字稿

时间:2017-12-31 05:31:19

标签: node.js typescript import es6-modules

我有一个打字稿项目,它使用我们的一个节点模块,这些模块通常在我们的前端运行。我们现在希望在我们服务器的节点中使用此模块。

该模块使用es6导入语法import { props } from 'module/file'

当我使用以下任一方法包含一个ref in typescript时

import { props } from 'module/file';
var props = require('module/file');

我从typescript

收到以下错误
unexpected token 'import' 
(function (exports, require, module, __filename, __dirname) { import

重新编写模块是一项很大的工作,我尝试过使用babel-plugin-dynamic-import-node以及SystemJS。

这些系统的问题在于它们都是异步的,所以我无法以标准方式导入模块,因此当我们达到这一点时,我需要做一大堆重写。我可以在node.js中原生使用import。

我不能成为第一个遇到此问题的人,但我似乎找不到合适的解决方案。

---------------更新设置-------------

回应@ DanielKhoroshko的回应。我试图导入的原始模块通常由webpack打包,以便在前端使用。我现在尝试在服务器端和前端(通过前端的webpack)使用相同的模块,而无需重新编写imports以使用require并且无需运行webpack捆绑js以在服务器上使用。

要明确的是,原始模块是用JS编写的,我们试图使用这个模块的服务是用打字稿编写并编译的。当打字稿尝试require使用import的旧模块时,我们正在遇到这个问题。

------------------一些进步---------------------------

我通过在导入的模块中创建一个文件取得了一些进展,该模块使用node.js中的babel将es6代码转换为commonJS模块。

我已经通过

完成了这项工作
var babel = require("babel-core")

var store = babel.transformFileSync(__dirname + '/store.js', {
    plugins: ["transform-es2015-modules-commonjs"]
});

module.exports = {
    store: store.code
}

我现在可以在我的新node.js项目中获得store。但是,store.js文件中的子模块不包含在导出中。

所以在我的模块中,它说 import activities from './reducers/activities'; 我现在得到一个错误 Cannot find module './reducers/activities'

如何让babel进行深度遍历以包含子目录?

2 个答案:

答案 0 :(得分:1)

unexpected token 'import'表示您在不支持import/export命令的环境中运行es-modules代码。如果您在TypeScript中编写代码,那么在构建浏览器之前首先将其转换为或者使用ts-node在服务器端运行它是很重要的。

如果您使用的是webpack,则会有加载器ts-loaderawesome-typescript-loader

你的设置是什么?

要描述模块,您需要在同一个文件夹中创建一个activities.d.ts文件,其中js-version(我理解它被称为activities.js和容器一个reducer)驻留在以下(大约。):

import { Reducer } from 'redux';

export const activities: Reducer<any>;

答案 1 :(得分:1)

@Daniel Khoroshko在很多方面是正确的,我最终找到了@std/esm,它允许你导入es6模块,并且工作也可以获取包含的导入。

var babel = require('babel-register')({
    presets: ["env"]
});

    require = require('@std/esm')(module);

    var store = require('ayvri-viewer/src/store');

    exports.default = {
        store: store
    }

我必须运行babel才能从es6到节点兼容的es5获得一致的构建