我在node js(07.10.19的最新版本的node.js)应用程序中有一个.ts文件,其中包含导入节点模块而没有默认导出。我使用以下结构:import { Class } from 'abc';
运行代码时,出现以下错误:Cannot use import statement outside a module
。
在网络上,我看到了针对此问题的许多解决方案(针对.js),但这对我没有帮助,也许是因为我有打字稿文件。这是我的代码:
import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...
这是我的tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true
}
}
答案 0 :(得分:12)
Adding "type": "module"
to package.json会告诉Node您正在使用ES2015模块,这应该摆脱错误,但是随后您需要通过设置func getUser(id: String) -> AppUser? {
let db = Firestore.firestore()
let userRef = db.collection("users").document(id)
userRef.getDocument { (document, error) in
if let document = document, document.exists {
let userID = document.data()?["id"] as! String
let userDisplayName = document.data()?["displayName"] as! String
let userPhotoURL = document.data()?["photoURL"] as! String
let userPoints = document.data()?["points"] as! Int?
let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
let user = AppUser(id: userID,
displayName: userDisplayName,
photoURL: userPhotoURL,
points: userPoints,
knownLanguageCodes: userKnownLanguageCodes)
return user
} else {
print("Error getting user")
return nil
}
}
}
而不是{{来告诉Typescript生成这种类型的模块。 1}}。
但这会导致当前代码出现问题,因为尽管您使用的是ES6 "module": "es2015"
语句,但您使用的是commonJS "commonjs"
语法进行导出,而Node的ES模块加载器也会遇到问题。有两种处理方法:
import {}
,但告诉Node用giving it a .cjs extension将此文件解释为commonJS。module.exports = {}
第一个选项可能会有些棘手,因为编译器将输出.js文件,并且您必须一直将其更改为.cjs(据我所知)。使用第二个选项,您应该能够使用Node运行文件(包括版本<13.8的--experimental-modules标志)。
如果您绝对需要使用commonJS,也许最好为Node:@types/node安装类型定义,然后将导入更改为commonJS格式:module.exports
,并保留其余设置。是(尽管您可以在package.json中添加“ type”:“ commonjs”以明确表示)。
答案 1 :(得分:4)
我遇到了非常相似的问题。我必须安装 nodemon 并始终通过 nodemon index.ts
yarn add -D nodemon
package.json
"scripts": {
"start": "nodemon index.ts"
}
或从命令行指定文件
package.json
"scripts": {
"nodemon": "nodemon $1"
}
答案 2 :(得分:1)
安装软件包ts-node并更改package.json
"scripts": {
"dev": "ts-node index.ts"
}
答案 3 :(得分:0)
获取的可能性很多,
SyntaxError:无法在模块外部使用import语句
运行打字稿时
。在设置中,我从脚本AbModule
中导入了一个名为AbModule
(AbClassName
具有类testab.ts
)的模块。
testab.ts
有import stmt
,
import {AbClassName} = 'testAdapterDir/AbModule.po.ts';
但是,
AbModule
拥有所有*.ts
个文件,并且不存在*.js
个文件。
解决方法是
在运行以下代码时可能会出错,但是可以放心地忽略它们。
cd AbModule path
tsc *.ts
现在AbModule
也应该包含所有*.js
的编译文件。
现在运行testab.ts
,发现上述错误不再存在
答案 4 :(得分:0)
确保 "main"
中的 package.json
字段指向编译后的 index.js
而不是 index.ts