Javascript SyntaxError:意外标记';出口';在带有Typescript和Webpack的Nodejs项目中
我试图找到这个解决方案的答案,但我找到的答案通常是将“模块”添加到脚本标记中(这在我的情况下不适用,因为我没有编写浏览器代码),或者在javascript文件中使用导入/导出(Node目前不支持),这意味着需要使用babel或typescript。因为我在typescript项目中看到了这个错误,所以我不希望看到这个错误 实际上,我有2个typescript/webpack项目(设置几乎相同,项目A取决于项目B),1个从另一个导入定义 在项目B中,我有几个类,其中两个是导出的,还有一些其他定义。在项目B的index.ts中:Javascript SyntaxError:意外标记';出口';在带有Typescript和Webpack的Nodejs项目中,javascript,node.js,typescript,webpack,Javascript,Node.js,Typescript,Webpack,我试图找到这个解决方案的答案,但我找到的答案通常是将“模块”添加到脚本标记中(这在我的情况下不适用,因为我没有编写浏览器代码),或者在javascript文件中使用导入/导出(Node目前不支持),这意味着需要使用babel或typescript。因为我在typescript项目中看到了这个错误,所以我不希望看到这个错误 实际上,我有2个typescript/webpack项目(设置几乎相同,项目A取决于项目B),1个从另一个导入定义 在项目B中,我有几个类,其中两个是导出的,还有一些其他定义。
export*from./types';
从“./specService/spec option service.class”导出*;
从“./converter/xpath converter.class”导出*;
这些产品的出口方式如下:
//types.ts
//
导出接口IElementInfo{
只读id?:字符串;
只读递归?:字符串;
只读丢弃?:ReadonlyArray;
只读后代?:{
只读方式:字符串;
只读throwIfCollision?:布尔值;
只读throwIfMissing?:布尔值;
};
}
// ... 加上其他类似定义的导出
//specService/spec-option-service.class.ts
//
导出类SpecOptionService{。。。
//converter/xpath-converter.class.ts
//
导出类XpathConverter{。。。
然后在ProjectB的index.ts中,我导出所有定义(export*fromBlah),供客户机使用,如本文顶部所示
当我构建项目B时,导出不存在这样的问题
在将项目B安装到项目A中之后
从我正在导入的typescript文件中,使用:
从“ProjectB”导入*作为ProjectB
Webpack甚至成功地构建了项目A的捆绑包,没有任何错误。错误发生在运行时,在本例中,当我运行测试时,我会看到以下情况:
/Users/User/dev/github/js/projecta/node_modules/projectb/lib/index.ts:2
export * from './types';
^^^^^^
SyntaxError: Unexpected token 'export'
at Module._compile (internal/modules/cjs/loader.js:892:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Module.require (internal/modules/cjs/loader.js:849:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.projectb (/Users/User/dev/github/js/projecta/dist/projecta-test-bundle.js:292:18)
在projectb的webpack包的末尾,我发现了以下内容:
/Users/User/dev/github/js/projecta/node_modules/projectb/lib/index.ts:2
export * from './types';
^^^^^^
SyntaxError: Unexpected token 'export'
at Module._compile (internal/modules/cjs/loader.js:892:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Module.require (internal/modules/cjs/loader.js:849:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.projectb (/Users/User/dev/github/js/projecta/dist/projecta-test-bundle.js:292:18)
module.exports=webpack\u require(/*!./lib*/“/lib/index.ts”)
我认为这是错误的。为什么webpack为“es5”目标构建的捆绑包包含对typescript的引用?这不一定会失败吗?我希望对生成的索引有要求。js文件(不是索引。ts)
这是我第一次用typescript跨项目边界进行导入/导出,所以我知道我做错了什么,但是什么呢
两个项目中的tsconfig.json文件相同:
{
“编译器选项”:{
“allowJs”:正确,
“alwaysStrict”:没错,
“esModuleInterop”:正确,
“模块”:“commonjs”,
“moduleResolution”:“节点”,
“noImplicitAny”:没错,
“源地图”:正确,
“严格检查”:正确,
“目标”:“es5”,
“类型”:[
“摩卡”,“节点”
],
“lib”:[
“es5”,
“es2015”,
“es6”,
“dom”
]
},
“包括”:[
“lib/***”
],
“排除”:[
“节点_模块”,
“***规格ts”
]
}
以及网页包配置:
{
devtool: 'source-map',
entry: {
index: './lib/index.ts'
},
target: 'node',
mode: mode,
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.ts(x?)$/,
use: 'ts-loader'
},
{
test: /\.json$/,
use: 'json-loader'
}
]
},
plugins: [
new webpack.DefinePlugin({ 'process.env.NODE_ENV': '"production"' }),
new webpack.BannerPlugin({
banner: '#!/usr/bin/env node',
raw: true
})
],
resolve: {
extensions: ['.ts', '.js', '.json']
},
watchOptions: {
ignored: /node_modules/
},
output: {
filename: 'projecta-bundle.js',
sourceMapFilename: 'projecta-bundle.js.map',
path: path.join(__dirname, 'dist'),
libraryTarget: 'commonjs'
}
}
项目A和B分别是plastikfan/jaxom和plastikfan/zenobia。在将最新版本的jaxom发布给npm之前,我正在执行npm发布前检查(了解到这是处理早期npm包的明智之举),以检查客户端是否可以按预期使用该包。(过去我在导出某些内容时出错,但这一点在客户端尝试使用它之前并不明显。据我所知,在发布之前,这并不是什么问题。建议的方法是使用nom pack打包包,然后将其安装到客户端)
仅供参考,zenobia package.json为(精简版):
和jaxom的cutdown package.json:
{
"name": "jaxom",
"main": "./lib/index.ts",
"scripts": {
"clean": "rimraf dist && rimraf decl",
"t": "mocha ./dist/jaxom-test-bundle.js",
"test": "npm audit --skip-unused && npm run t",
"build": "npm run build:d",
"build:d": "webpack -d --env.mode development",
"build:p": "webpack -p --env.mode production",
"build:t": "webpack --config webpack.config.test.js"
},
"dependencies": {
"@types/ramda": "^0.26.36",
"@types/xregexp": "^3.0.30",
"jinxed": "0.0.2",
"moment": "^2.24.0",
"ramda": "^0.26.1",
"xmldom-ts": "^0.3.1",
"xpath-ts": "^1.3.13",
"xregexp": "^4.2.4"
},
"devDependencies": {
"@commitlint/cli": "^8.2.0",
"@commitlint/config-conventional": "^8.2.0",
"@types/chai": "^4.2.5",
"@types/dirty-chai": "^2.0.2",
"@types/mocha": "^5.2.7",
"@types/sinon": "^7.5.1",
"@types/sinon-chai": "^3.2.3",
"chai": "^4.2.0",
"commitizen": "^4.0.3",
"cz-conventional-changelog": "^3.0.2",
"depcheck": "^0.9.1",
"dirty-chai": "^2.0.1",
"json-loader": "^0.5.7",
"mocha": "^6.2.2",
"precommit-hook": "^3.0.0",
"raw-loader": "^4.0.0",
"rimraf": "^3.0.0",
"sinon": "^7.5.0",
"sinon-chai": "^3.3.0",
"snazzy": "^8.0.0",
"ts-loader": "^6.2.1",
"tslint": "^5.20.1",
"tslint-config-semistandard": "^8.0.1",
"typescript": "^3.7.2",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10",
"webpack-config-utils": "^2.3.1",
"webpack-node-externals": "^1.7.2"
}
}
我认为tsconfig在这里可能是个问题。
因为当您从“ProjectB”导入
import*作为ProjectB时;
您的ProjectB文件将不会被typescript传输,因为projectA tsconfig的include
和exclude
属性。请尝试将ProjectB添加到projectA的编译过程中。类似于
include:[“lib/***”,“my/path/to/projectB/**]
在projectA tsconfig中。对我来说,是tsconfig.json中的模块
键
我把它改成:
“模块”:“esnext”
为此:
“模块”:“commonjs”
谢谢Nick。那么当你说“my/path/to/projectB/**”时,这是什么意思?projectB是一个不同的npm包,所以我真的不知道projectB的路径是什么意思。package.json中没有定义依赖项吗?我正在使用其他类型脚本项目,而它们不在“include”中,那么我做了什么错事来需要它呢?@Plastikfan其他类型脚本包已经由它的创建者为您传输到js(在node_modules文件夹中进行检查)。有两种方法可以让它工作1)在运行projectA之前传输projectB(在projectB运行npm运行build
或您为构建它而创建的另一个命令中)。然后在projectA中,您需要导入projectB的dist
(而不是src
!),其中javascript代码为。2)将projectB与projectA一起传输。为此,您需要将其添加到tsconfiginclude
。路径应类似于include:[“node\u modules/projectB”]
@Plastikfan我想说的-没有人将未翻译的typescript代码发布到npm
。所有的包通常都包含js
代码和.d.ts
打字Sok谢谢Nick。我想你可能有点误解了我。项目A没有直接访问项目B的typescript。B和其他任何项目一样已传输到js的typescript项目。@Plastikfan好的,那么它很奇怪。您能给我看一下projectB的package.json
,或者至少.M的属性main