1

我在我的节点项目中使用 ESM。"type": "module"在 package.json 中添加

// index.js

import config from 'config'
// default.js

export default {
  time: 123,
  ...
  ...
}

但是在节点配置中出现错误

Error: Cannot parse config file: '/home/Documents/.../config/default.js': Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/Documents/.../config/default.js
require() of ES modules is not supported.
require() of /home/Documents/.../config/default.js from /home/Documents/.../node_modules/config/parser.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename default.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /home/Documents/.../package.json.

我可以通过添加default.cjs而不是解决这个问题,default.js但是因为我使用的是 ESM,所以我希望它也可以与.js扩展一起使用。我错过了什么吗???我也可以添加.json,但我有很大的配置变量和动态值,这就是为什么使用.js.

先感谢您 !!!

4

1 回答 1

1

根据https://github.com/node-config/node-config/wiki/Special-features-for-JavaScript-configuration-files您不能将 ESM 用于配置文件,但必须使用其他受支持的格式之一。

尚不支持将文件加载为 ESM。所以 .mjs 或 .js 当 "type":"module" 或 --experimental-modules 不起作用。

但是有一个解决方法。例如,您可以具有以下结构,其中dynamic.js是您拥有大配置变量和动态值的地方:

.
├── config
│   ├── dynamic.js
│   └── test.cjs
├── index.js
├── node_modules
│   ├── config
│   ├── json5
│   └── minimist
├── package-lock.json
└── package.json

必须告诉 nodejs 你使用 esm。因此,在您的package.json中,您将希望拥有:

{
  "scripts": {
    "start": "NODE_ENV=test node index.js"
  },
  "type": "module"
}

index.js文件的开头,您要导入node-config

import config from 'config';

const {default:configVariable} = await config.get('variable');

console.debug(configVariable.foo);

在上述情况下,您可以编写“Hello World!” 如果config/test.cjsconfig /dynamic.js具有以下内容,则发送到您的终端:

'use strict'

module.exports = {
    variable: import('./dynamic.js')
}

测试.cjs

export default {
    v1: 'var1',
    v2: 'var2',
    foo: 'Hello World!'
}

动态的.js

那么上面的结果应该是:

$ npm start

> start
> NODE_ENV=test node index.js

Hello World!

显然,您可以重命名variableconfigVariable更改为任何您想要的名称。

在我的测试中,我对上述将 esm 导出为 Promise 的方式没有任何问题。但是,如果您确实对此有任何疑问,您可以通过将import(). require('config/raw').raw请参阅:https ://github.com/node-config/node-config/wiki/Special-features-for-JavaScript-configuration-files#using-promises-processstdout-and-other-objects-in-javascript-config-文件.

于 2022-01-28T19:33:08.030 回答