Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SyntaxError:意外标记';出口';在带有Typescript和Webpack的Nodejs项目中_Javascript_Node.js_Typescript_Webpack - Fatal编程技术网

Javascript SyntaxError:意外标记';出口';在带有Typescript和Webpack的Nodejs项目中

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中,我有几个类,其中两个是导出的,还有一些其他定义。

我试图找到这个解决方案的答案,但我找到的答案通常是将“模块”添加到脚本标记中(这在我的情况下不适用,因为我没有编写浏览器代码),或者在javascript文件中使用导入/导出(Node目前不支持),这意味着需要使用babel或typescript。因为我在typescript项目中看到了这个错误,所以我不希望看到这个错误

实际上,我有2个typescript/webpack项目(设置几乎相同,项目A取决于项目B),1个从另一个导入定义

在项目B中,我有几个类,其中两个是导出的,还有一些其他定义。在项目B的index.ts中:

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一起传输。为此,您需要将其添加到tsconfig
include
。路径应类似于
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