繁体   English   中英

Typescript:语法错误:意外的令牌“导出”

[英]Typescript : SyntaxError: Unexpected token 'export'

在我的 React 项目中,我需要在 3 个 typescript 项目之间共享模型(在我的案例中是打字稿接口)。 所以我选择了 bit.env 并将我所有的模型导入到https://bit.dev/model/index/~code并且一切都很好。

然后我需要验证 model 中的字段,所以我将实用程序功能添加到https://bit.dev/model/index/~code#util.ts并将其部署到 bit.env

当我尝试在我的项目#2(我保留 firebase 云函数的地方)中使用这个助手 function 时,我开始面临以下错误。

/Users/vinoth.gopu/Documents/mine/oss/Cloud/functions/node_modules/@bit/model.index/dist/index.js:1
export * from './admin';
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1101:16)
    at Module._compile (internal/modules/cjs/loader.js:1149:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)

我在项目 #2 中的代码

export const placeOrder = functions
    .runWith({
        memory:'256MB'
    })
    .region(cloudConfig.firebase.region)
    .firestore
    .document('Orders/{OrderId}')
    .onCreate((snap, context) => {
        const orderDetails = snap.data() as UserOrders;

        try {
            //check if all fields of interface implemented
            if(isOrder(orderDetails)) { // PROBLEM HERE
                 //do something
            }

正如上面代码中所指出的,我可以使用该 model 项目中的所有接口,但 helper function 会抛出错误消息。

我参考了这些文章和链接

  1. 获取意外的令牌导出
  2. https://medium.com/the-node.js-collection/an-update-on-es6-modules-in-node.js-42c958b890c

但它们似乎都不起作用(我也有点困惑哪个项目需要转译共享 model 或项目 #2 在我的情况下?)。 我可以理解这是节点的一些问题,它无法识别 ES6 模块并且需要某种中间转换。 但我想知道所有具有类似export语句的接口如何工作得很好。 我想了解我在这里缺少什么。

NodeJS 默认使用 CommonJS 方式加载包。 使用较新版本的 NodeJS,您可以使用.mjs文件或告诉引擎该项目是基于模块的项目来获得 JavaScript 的模块功能。

我不知道 FireBase 是否使用最新的 Node 版本,但这至少应该可以解释为什么您会看到该错误。 在 NodeJS 已经开始在 CommonJS 中包装东西之后很久,JS 就获得了对 Export 的支持,这就是为什么它很难实现。 遗留支持几乎总是痛苦的。

您可以通过更改为 CommonJS 或按照链接的 NodeJS ESM 页面中概述的步骤来解决此问题。

至于为什么导出的函数需要这个,而导出的接口不需要,这是因为从TS编译成JS的接口是……什么都没有。 完全没有。 JS 没有类型系统,因此当 TS 被编译时,任何不需要的东西都会被解析为从编译到 JS 目标中排除。

似乎答案就在 bit.dev 中

"bit": {
    "env": {
      "compiler": {
        "bit.envs/compilers/react-typescript@3.1.52": {
          "rawConfig": {
            "tsconfig": {
              "compilerOptions": {
                "target": "ES5",
                "module": "CommonJS"
              }
            }
          }
        }
      }
    },
    "componentsDefaultDirectory": "src/{name}",
    "packageManager": "npm"
  },

通过处理转译解决了我的问题。

在我的 React 项目中,我需要在 3 个 typescript 项目之间共享模型(在我的例子中是打字稿接口)。 所以我选择了 bit.env 并将我所有的模型导入到https://bit.dev/model/index/~code并且一切都很好。

然后我需要验证 model 中的字段,因此我将实用程序功能添加到https://bit.dev/model/index/~code#util.ts并将其部署到 bit.env

当我尝试在我的项目#2(我保留 firebase 云功能的地方)中使用这个助手 function 时,我开始遇到以下错误。

/Users/vinoth.gopu/Documents/mine/oss/Cloud/functions/node_modules/@bit/model.index/dist/index.js:1
export * from './admin';
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:1101:16)
    at Module._compile (internal/modules/cjs/loader.js:1149:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)

我在项目 #2 中的代码

export const placeOrder = functions
    .runWith({
        memory:'256MB'
    })
    .region(cloudConfig.firebase.region)
    .firestore
    .document('Orders/{OrderId}')
    .onCreate((snap, context) => {
        const orderDetails = snap.data() as UserOrders;

        try {
            //check if all fields of interface implemented
            if(isOrder(orderDetails)) { // PROBLEM HERE
                 //do something
            }

正如上面代码中所指出的,我可以使用 model 项目中的所有接口,但助手 function 会抛出错误消息。

我参考了这些文章和链接

  1. 获得意外的令牌导出
  2. https://medium.com/the-node-js-collection/an-update-on-es6-modules-in-node-js-42c958b890c

但是它们似乎都不起作用(我也有点困惑哪个项目需要转译共享 model 或项目#2 在我的情况下?)。 我可以理解这是节点无法识别 ES6 模块并需要某种中间转译的问题。 但我想知道所有具有类似export语句的接口如何工作得很好。 我想了解我在这里缺少什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM