节点 --experimental-modules - 错误:找不到模块

Jam*_*ber 54 javascript node.js google-chrome-devtools ecmascript-6

尝试导入本地文件时出现错误,但在使用 npm 包时没有问题。

服务器.js

import express from 'express'
import next from 'next'

import apis from './src/server/api'
Run Code Online (Sandbox Code Playgroud)

api.js

export default {
  ello: 'bye',
  jamie: 'hey'
}
Run Code Online (Sandbox Code Playgroud)

启动应用

node --experimental-modules --inspect server.js
Run Code Online (Sandbox Code Playgroud)

错误

For help, see: https://nodejs.org/en/docs/inspector
(node:20153) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/default_resolve.js:59
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module '/var/www/goldendemon.hutber.com/src/server/api' imported from /var/www/goldendemon.hutber.com/server.js
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:59:13)
    at Loader.resolve (internal/modules/esm/loader.js:70:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:143:40)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:43:40)
    at link (internal/modules/esm/module_job.js:42:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*ber 100

如果其他人有这个问题,我正在回答我自己的问题。

事实证明,在实验模式下,您需要定义带有扩展名的完整路径。所以我试图导入index.js认为它会知道。

要解决这个问题:

import express from 'express'
import next from 'next'
import api from './src/server/api/index.js'
Run Code Online (Sandbox Code Playgroud)

  • 天哪,这很有挑战性……添加“.js”扩展名是阻碍我的原因,呃。您的回答对诊断这个很有帮助! (7认同)
  • 你如何使用 typescript 来完成这项工作?当我运行“tsc”时,我的文件将使用不带扩展名的导入进行编译。 (7认同)
  • 对于 TypeScript(使用 Node 12),请参阅 Mateus 的回答 (#answer-57558982)。使用“node”运行脚本时使用此(“--es-module-specifier-resolution=node”)选项将解决问题,尽管您可能会遇到其他小问题(例如,“__dirname”未定义)。 (6认同)

小智 44

在节点 12 上,您有 2 个选项:

  1. 在 package.json、实验模块上使用 type="module" 并指定具有 specidier-resolution 的扩展,如下所示: node --experimental-modules --es-module-specifier-resolution=node src/index

  2. 或不使用说明符分辨率。请记住,您必须在每个位置指定文件的扩展名。

  • 请注意,目前尚不清楚“--es-module-specifier-resolution”是否会继续存在。这也意味着代码与其他 ES 模块运行时(例如浏览器)不兼容。 (2认同)