我有一个打字稿项目,它使用我们的一个节点模块,这些模块通常在我们的前端运行。我们现在希望在我们服务器的节点中使用此模块。
该模块使用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进行深度遍历以包含子目录?
答案 0 :(得分:1)
unexpected token 'import'
表示您在不支持import/export
命令的环境中运行es-modules代码。如果您在TypeScript中编写代码,那么在构建浏览器之前首先将其转换为或者使用ts-node
在服务器端运行它是很重要的。
如果您使用的是webpack,则会有加载器ts-loader
和awesome-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获得一致的构建