如何要求在 ES6 模块中导出的常量?

Posted

技术标签:

【中文标题】如何要求在 ES6 模块中导出的常量?【英文标题】:how to require constants which is exported in ES6 module? 【发布时间】:2020-11-13 12:35:48 【问题描述】:

原始变量在 ES6 模块中导出如下:

export const url = 'https://example.com/api'

我知道我可以使用这个变量 import url from 'src/api'

但问题是我不能在gatsby-config.js 文件中使用import,只能使用ES5 语法。

我试过这样:

const url = require('src/api')

但在 gatsby develop 时它不起作用并出现错误

错误如下:

export const url = 'https://example.com/api'
  ^^^^^^
  SyntaxError: Unexpected token 'export'

  - v8-compile-cache.js:226 NativeCompileCache._moduleCompile
    [project]/[v8-compile-cache]/v8-compile-cache.js:226:18

  - v8-compile-cache.js:172 Module._compile
    [project]/[v8-compile-cache]/v8-compile-cache.js:172:36

  - loader.js:995 Object.Module._extensions..js
    internal/modules/cjs/loader.js:995:10

  - loader.js:815 Module.load
    internal/modules/cjs/loader.js:815:32

  - loader.js:727 Function.Module._load
    internal/modules/cjs/loader.js:727:14

  - loader.js:852 Module.require
    internal/modules/cjs/loader.js:852:19

  - v8-compile-cache.js:159 require
    [project]/[v8-compile-cache]/v8-compile-cache.js:159:20

  - gatsby-config.js:4 Object.<anonymous>
    C:/project/gatsby-config.js:4:26

  - v8-compile-cache.js:178 Module._compile
    [project]/[v8-compile-cache]/v8-compile-cache.js:178:30

  - loader.js:995 Object.Module._extensions..js
    internal/modules/cjs/loader.js:995:10

  - loader.js:815 Module.load
    internal/modules/cjs/loader.js:815:32

  - loader.js:727 Function.Module._load
    internal/modules/cjs/loader.js:727:14

  - loader.js:852 Module.require
    internal/modules/cjs/loader.js:852:19

  - v8-compile-cache.js:159 require
    [project]/[v8-compile-cache]/v8-compile-cache.js:159:20

  - get-config-file.js:33 getConfigFile
    [project]/[gatsby]/dist/bootstrap/get-config-file.js:33:20

【问题讨论】:

改用module.exports 在加载之前使用babel-register之类的东西 - 如果它必须是在 CommonJS 模块中导入的 ES6 模块,那是你唯一的选择? 【参考方案1】:

当您使用module.exports 导出常量时,它不应出现此错误。这样做:

const yourUrl = 'https://example.com/api'

module.exports =  url: yourUrl 

【讨论】:

【参考方案2】:

希望您知道您要达到的目标,因为结果会产生违反 gatsbyjs 规范的反模式,因为它已经在读取和验证 gatsby-config.js 后在内部将代码从 es6 转换为 es5

所以,尝试这种方式来要求 gatsby-config.js 中的常量,这些常量是在 es6 模块中导出的

es6es5的转换,安装@babel/cli@babel/core包即npm install @babel/cli @babel/core --save-dev 在 package.json 中添加新的 npm/yarn 脚本 -> 脚本 -> "prepare_config" : "NODE_ENV=test babel ./gatsby-config.js &lt;LIST_OF_FILES_TO_CONVERT&gt; --out-dir ./" 确保babel-preset-gatsby 目录存在于node_modules 下,如果不存在则安装它,即npm install babel-preset-gatsby --save-dev 在项目根目录中添加.babelrc,具有以下代码用于babel预设和转换。

    "presets": [
        [
            "babel-preset-gatsby",
            
                "forceAllTransforms": true,
                "useBuiltIns": "usage"
            
        ]
    ]

或者如果你不想添加 .babelrc 然后在 package.json 中指定 babel 配置。

"babel": 
  "presets": [
    [
      "babel-preset-gatsby",
      
        "forceAllTransforms": true,
        "useBuiltIns": "usage"
      
    ]
  ]

现在首先运行npm run prepare_config 脚本进行转换,它将导入在 ES6 模块中导出的所需常量。

那么你就可以成功运行gatsby develop了。

【讨论】:

【参考方案3】:

更改type:"module"或设置package.json


  "name": "server",
  "version": "1.0.0",
  "type": "module",
  "description": "",
  "main": "server.js",
  "scripts": 
    "test": "echo "Error: notestspecified" && exit 1",
    "start": "nodemon server.js"
  ,
  "keywords": [
    
  ],
  "author": "",
  "license": "ISC",
  "dependencies": 
    "@babel/core": "^7.16.5",
    "body-parser": "^1.19.1",
    "cors": "^2.8.5",
    "dotenv": "^10.0.0",
    "express": "^4.17.2",
    "mongoose": "^6.1.3",
    "nodemon": "^2.0.15"
  

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 导出模块类型的 const 所以更改包 json 类型:模块

以上是关于如何要求在 ES6 模块中导出的常量?的主要内容,如果未能解决你的问题,请参考以下文章

在 ES6 模块中导出多个类

从模块中导出的角度组件在另一个模块中不可用

通过 <script src=""> 加载 JavaScript ES6 模块并在 <script> 标记中导入所有导出是不是相同?

ES6,如何在一行中导出导入的模块?

如何在 ES6 项目中导入我的 npm 模块?

ES6 在索引文件中导出/导入