Node.js 如何在typescript中使用带有es6导入语法的节点模块

Node.js 如何在typescript中使用带有es6导入语法的节点模块,node.js,typescript,import,es6-modules,Node.js,Typescript,Import,Es6 Modules,我有一个typescript项目,它使用了一个通常在前端运行的节点模块。我们现在希望在服务器上的节点中使用此模块 模块使用es6导入语法从“模块/文件”导入{props} 当我使用以下任一方法在typescript中包含ref时 import { props } from 'module/file'; var props = require('module/file'); 我从typescript中得到以下错误 unexpected token 'import' (function (exp

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

模块使用es6导入语法从“模块/文件”导入{props}

当我使用以下任一方法在typescript中包含ref时

import { props } from 'module/file';
var props = require('module/file');
我从typescript中得到以下错误

unexpected token 'import' 
(function (exports, require, module, __filename, __dirname) { import
重新编写模块是一项艰巨的工作,我已经尝试使用babel和babel插件动态导入节点以及SystemJS

这些系统的问题是它们都是异步的,所以我不能以标准方式导入模块,所以当我们达到可以在node.js中本机使用import的程度时,我需要进行大量的重写

我不是第一个有这个问题的人,但我似乎找不到有效的解决办法

---------------使用设置更新-------------

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

要明确的是,原始模块是用JS编写的,我们尝试使用此模块的服务是用typescript编写并传输的。当typescript试图
要求
使用
导入的旧模块时,正是在这一点上,我们遇到了问题

------------------一些进展---------------------------

我在导入的模块中创建了一个文件,该文件使用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.js
文件中的子模块不包括在导出中

在我的模块里,它说
从“./reducers/activities”导入活动
我现在得到一个错误
找不到模块“./reducer/activities”


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

意外标记“导入”
表示您正在不支持
导入/导出
命令的环境中运行es模块代码。如果您是用TypeScript编写代码,那么在为浏览器构建之前,必须先传输它,或者使用
ts node
在服务器端运行它

如果您正在使用webpack,则有加载程序
ts加载程序
awesome typescript加载程序

你的设置是什么


要描述该模块,您需要在js版本(我知道它被称为
activities.js
和容器a reducer)所在的同一文件夹中创建一个
activities.d.ts
文件,其中包含以下内容(大约):

从'redux'导入{Reducer};
出口成本活动:减速机;

@Daniel Khoroshko在许多方面都是正确的,我最终找到了
@std/esm
,它允许您导入es6模块,并使用find获取包含的导入

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的一致构建

如果您为SystemJS配置了客户端绑定,您可以使用
--format cjs
为服务器端创建另一个绑定。或者,您也可以使用SystemJS加载服务器端应用程序。@AluanHaddad谢谢,我没有看到作为SystemJS一部分的
--格式化cjs
,尽管我以前尝试过SystemJS。我在SystemJS中遇到的问题是,所需的模块作为承诺返回,这对我们如何编写服务器端和客户端都可用的模块有影响。谢谢@Daniel,我已经用细节更新了问题。我们包含的模块是用JS编写的,需要的代码是用TS编写的。最初的模块是用webpack打包的,但是,我们现在正试图在服务器上使用它,所以不想用webpack打包,我们正试图弄清楚如何直接使用这个包。嗨!这是一个有趣的解决方案。错误
找不到由typescript或节点生成的模块“./reducers/activities”
?可能是第一个,因为当导入的模块不存在类型时,typescript不理解导入。在这种情况下,我通常只需要
要求他们使用节点样式或书写类型,即您创建index.d.ts(现在将更新答案)感谢您的帮助Daniel,我与您提出的解决方案有点不同的方向,这可能适用于其他人,最终在所包含的模块中更新了不同的东西,有点像兔子。我会发布我的解决方案。
var babel = require('babel-register')({
    presets: ["env"]
});

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

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

    exports.default = {
        store: store
    }