typescript 如何将 TS 模块导入或要求到 CommonJS 文件中?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/49851556/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to import or require a TS-module into CommonJS file?
提问by slideshowp2
Because some reason, my some modules have to be js
files.
由于某种原因,我的一些模块必须是js
文件。
I import
ts module into my js
file like this:
我将import
ts 模块放入我的js
文件中,如下所示:
resolver.js
:
resolver.js
:
import { Message } from '../../connectors/message';
// console.log('Message: ', Message);
const resolver = {
Query: {
sendMessage: (root, args, ctx) => {
console.log(args, ctx);
return Message.send('1', 'message');
}
}
};
export { resolver };
message.ts
:
message.ts
:
const Message = {
send(id, type) {
return Promise.resolve({
recipient_id: '123',
message_id: '122'
});
}
};
export { Message };
I use webpack
to and awesome-typescript-loader
to compile my .ts
files.
我使用webpack
to 和awesome-typescript-loader
来编译我的.ts
文件。
Here is my tsconfig.json
:
这是我的tsconfig.json
:
{
"compilerOptions": {
"target": "es6",
"lib": ["es6", "esnext"],
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"declaration": false,
"outDir": "dist",
"typeRoots": ["node_modules/@types"]
},
"files": ["src/main.ts"],
"exclude": ["node_modules"]
}
webpack.config.js
:
webpack.config.js
:
var nodeExternals = require('webpack-node-externals');
var webpack = require('webpack');
var path = require('path');
var fs = require('fs');
/* helper function to get into build directory */
var distPath = function(name) {
if (undefined === name) {
return path.join('dist');
}
return path.join('dist', name);
};
var webpack_opts = {
entry: './src/main.ts',
target: 'node',
output: {
filename: distPath('main.js'),
libraryTarget: 'commonjs2'
},
resolve: {
extensions: ['.ts', '.js'],
modules: ['node_modules', 'src']
},
plugins: [
new webpack.LoaderOptionsPlugin({
options: {
test: /\.ts$/,
ts: {
compiler: 'typescript',
configFileName: 'tsconfig.json'
},
tslint: {
emitErrors: true,
failOnHint: true
}
}
})
],
devtool: 'source-map',
module: {
loaders: [
{
test: /\.ts$/,
loaders: 'awesome-typescript-loader'
}
]
},
externals: [nodeExternals()]
};
module.exports = webpack_opts;
But I got this error:
但我收到了这个错误:
(function (exports, require, module, __filename, __dirname) { import { Message } from '../../connectors/message';
^^^^^^
SyntaxError: Unexpected token import
at new Script (vm.js:51:7)
at createScript (vm.js:136:10)
at Object.runInThisContext (vm.js:197:10)
at Module._compile (internal/modules/cjs/loader.js:618:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
at Module.require (internal/modules/cjs/loader.js:598:17)
at require (internal/modules/cjs/helpers.js:11:18)
How to solve this?
如何解决这个问题?
-- update v1 --
-- 更新 v1 --
I try to use it with require
我尝试使用它 require
// import { Message } from '../../connectors/message';
const { Message } = require('../../connectors/message');
console.log('Message: ', Message);
const resolver = {
Query: {
sendMessage: (root, args, ctx) => {
console.log(args, ctx);
return Message.send('1', 'message');
}
}
};
export { resolver };
But I still got an error:
但我仍然遇到错误:
internal/modules/cjs/loader.js:550
throw err;
^
Error: Cannot find module '../../connectors/message'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:548:15)
at Function.Module._load (internal/modules/cjs/loader.js:475:25)
at Module.require (internal/modules/cjs/loader.js:598:17)
at require (internal/modules/cjs/helpers.js:11:18)
at Object.<anonymous> (/Users/ldu020/workspace/workplace-adapter-graphql/src/graphql/modules/messages/resolver.js:3:21)
at Module._compile (internal/modules/cjs/loader.js:654:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
-- update v2 --
-- 更新 v2 --
I add .ts
file extension to path:
我将.ts
文件扩展名添加到路径:
const { Message } = require('../../connectors/message.ts');
still got error:
仍然有错误:
export { Message };
^^^^^^
SyntaxError: Unexpected token export
at new Script (vm.js:51:7)
at createScript (vm.js:136:10)
at Object.runInThisContext (vm.js:197:10)
at Module._compile (internal/modules/cjs/loader.js:618:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
at Module.require (internal/modules/cjs/loader.js:598:17)
at require (internal/modules/cjs/helpers.js:11:18)
update 3: add package.json
更新3:添加package.json
"devDependencies": {
"@types/faker": "^4.1.4",
"@types/jest": "^19.2.4",
"@types/node": "^7.10.0",
"babel-cli": "^6.26.0",
"faker": "^4.1.0",
"jest": "^20.0.4",
"ts-jest": "^20.0.6",
"ts-node": "^3.2.0",
"tslint": "^5.11.0",
"typescript": "^2.9.2"
},
回答by Amirali Ameri
your node version doesn't support import
. use require instead:
您的节点版本不支持import
. 使用 require 代替:
var Message = require('./path').Message;
-- update --
since you are trying to import a .ts
file, you need to write that in the path. like this: require('./path.ts');
-- 更新 -- 由于您正在尝试导入.ts
文件,因此需要将其写入路径中。像这样:require('./path.ts');
回答by Rahul Bisht
try using require('../../connectors/message')
尝试使用 require('../../connectors/message')