为什么在 reactJS 中导入组件时没有添加 .js [文件扩展名]?

Why .js [file Extension] is not added while importing a component in reactJS?

我们正在用 reactJS 创建不同的组件,

示例:

App.js
index.js
LandingPage.js
.....

在另一个组件中导入此组件时,我们没有添加扩展 .js

示例:

index.js:

import App from './App'

// here './App' we are not adding .js  

有谁知道原因吗?

您的 Webpack 配置负责解析常见的扩展(即:.js.jsx)。如果您的项目正在使用 create-react-app,那么这已经在幕后为您完成了。

Create-react-app 已经自动解析了以下扩展:

extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],

这里有更多信息 https://github.com/webpack/docs/wiki/Configuration#resolveextensions

这一切都是通过 webpack 模块解析完成的,resolver 是一个库,可以帮助通过绝对路径定位模块。

依赖模块可以来自应用程序代码或第三方库。解析器帮助 webpack 为每个这样的 require/import 语句找到需要包含在包中的模块代码。 webpack 在捆绑模块时使用 enhanced-resolve 解析文件路径。

根据上述规则解析路径后,解析器会检查路径是否指向文件或目录。如果路径指向一个文件:

  • 如果路径有文件扩展名,那么文件会直接打包。
  • 否则,使用 resolve.extensions 选项解析文件扩展名,它告诉解析器哪些扩展名可以解析,例如.js, .jsx.

Resolve extensions: 这些选项改变了模块的解析方式。 webpack 提供合理的默认值,但可以详细更改解析。

webpack.config.js

module.exports = {
  //...
  resolve: {
    enforceExtension: false
  }
};

如果这里的值为true,则不允许无扩展名的文件。因此,默认情况下,如果 ./foo 具有 .js 扩展名,则 require('./foo') 有效,但启用此 (enforceExtension) 后,仅 require('./foo.js') 有效。

webpack.config.js

中将 .js 添加到 resolve/extensions
resolve: {
  extensions: [".ts", ".js", ".mjs", ".json"],
  symlinks: false,
  cacheWithContext: false,
},