【问题标题】:`import app from "./app"` does not work, but it's supposed to work`import app from "./app"` 不起作用,但它应该可以工作
【发布时间】:2020-06-30 10:47:11
【问题描述】:

目标

我想将应用程序从app.js 导入到init.js。

问题

对我来说,明确编写文件扩展名是可行的,但省略它却不行。

  • "./app.js" 有效 ✅
  • "./app" 不起作用????

但我正在关注的教程有 "./app" 工作。 那么为什么它对我不起作用?

我唯一不同的是在package.json 中添加"type": "module" 并将 .babelrc 命名为 babel.config.json,因为更新了 Babel 节点的使用。

版本

node v13.60
"@babel/core": "^7.8.7",
"@babel/node": "^7.8.7",
"express": "^4.17.1"

错误信息

Error: Cannot find module /Users/leochoo/dev/wetube/app imported from /Users/leochoo/dev/wetube/init.js
    at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:100:13)
    at Loader.resolve (internal/modules/esm/loader.js:72:33)
    at Loader.getModuleJob (internal/modules/esm/loader.js:156:40)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
    at link (internal/modules/esm/module_job.js:41:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}
[nodemon] app crashed - waiting for file changes before starting...

文件相关

// app.js
const app = express();
...
export default app; //share this to init
// init.js
import app from "./app.js";
// babel.config.json
{
  "presets": ["@babel/preset-env"]
}
// package.json
{
  "name": "wetube",
  "version": "1.0.0",
  "author": "Leonard Choo",
  "dependencies": {
    "@babel/core": "^7.8.7",
    "@babel/node": "^7.8.7",
    "body-parser": "^1.19.0",
    "cookie-parser": "^1.4.5",
    "express": "^4.17.1",
    "helmet": "^3.21.3",
    "morgan": "^1.9.1"
  },
  "scripts": {
    "start": "nodemon --exec babel-node init.js --delay 2"
  },
  "devDependencies": {
    "@babel/preset-env": "^7.8.7",
    "nodemon": "^2.0.2"
  },
  "type": "module"
}

截屏

已搜索

也许this link 是相关的?

【问题讨论】:

  • MDN 说:“某些捆绑程序可能允许或要求使用扩展;请检查您的环境。”
  • init.js 和 app.js 在同一个文件夹吗?还有你在学习哪个教程?
  • @Supercool。您可以从屏幕截图中看到它们位于同一文件夹中。这是一个付费课程,所以我不能分享它:(

标签: javascript node.js express babeljs


【解决方案1】:

https://babeljs.io/docs/en/babel-register

babel-node 在内部使用 @babel/register。而@babel/register 不支持即时编译原生 Node.js ES 模块,因为目前还没有稳定的 API 用于拦截 ES 模块加载。

所以,目前没有办法同时使用它们,@babel/register 和 ES modules。(type: module 将使您的 nodejs 将每个 js 文件视为 ES module)

【讨论】:

  • 无法同时使用它们——你确定吗?
  • @Nelles 如果我们使用“使用”这个词来表示官方支持,是的,没有办法同时使用它们。 @babel/register 不支持 nodejs 原生 ES module 系统。
  • 感谢您的回答!!但我不确定这与文件扩展名有什么关系;(
  • @Leonard babel 正在解析 js 文件并将所有 unsupported 语法重写为 supported 一个。你在package.json 中设置了"type": "module"。我认为babel 解析器有一个加载es module with native node 的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2021-09-11
  • 2013-09-07
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多