已经在 package.json 写了 main 字段,但为什么还是得这样写?

已经在 package.json 写了 main 字段,
但为什么还是得这样写才能正确引入

const axios = require('axios/dist/node/axios.cjs')

写了 main 字段 不是就能在 require 时自动找到模块入口吗?

阅读 2.5k
5 个回答

如果在package.json文件中设置了main字段,那么通常情况下应该可以通过以下方式引入axios:

const axios = require('axios');

(1) 题主的情况应该是Node.js 版本可能不支持 ESM 模块。在这种情况下,尝试使用 CommonJS 格式来引入模块:

const axios = require('axios/dist/node/axios.cjs');

这种方式会直接引入 CommonJS 格式的模块,而不是 ESM 格式的模块。

(2) 另一种情况:项目依赖树中存在多个版本的axios,导致 Node.js 在解析模块时出现问题。可以使用

npm ls axios

命令查看依赖树中是否存在多个版本的 axios,如果存在,可以尝试使用

npm dedupe

命令将它们合并到同一个版本。

如果实在无法确定问题出现的原因,可以尝试重新安装 axios 模块,并清除缓存:

npm uninstall axios
npm cache clean --force
npm install axios

然后尝试再次引入模块,看看问题是否解决。

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

首先盲猜一下你是在 Node 中使用,客户端使用的话应该不会有问题

然后再猜一下你的 Node 版本小于 13.7,不识别 package.json 里的 exports,直接引用了 main 定义的入口,而这个入口是 ESM 的文件,require 只能引 commonjs 的导出。所以升级下 Node 版本就行,或者直接指定 cjs 文件

反对一下已采纳答案,这个和 Node 版本支不支持 ESM 没有关系,如果你用 ESM 的方式来使用 axios,也会有问题,因为他的依赖 proxy-from-env 不支持 ESM 的使用

估计node版本太低不支持ESM规范,node13才正式支持ESM。
axios的main字段值是index.js,只是说明此文件入口,但type: 'module'说明这个包是用ESM规范。

const axios = require('axios')

上面语句不支持是因为requirecommonjs规范,它无法正确解析ES moduel包,这点也可以从下面报错信息中看出:

const axios = require('axios')
              ^

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'F:\gitpro\rollup-event\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

而下面语句能正确解析,是因为axios/dist/node/axios.cjs采用的是commonjs规范

const axios = require('axios/dist/node/axios.cjs')
之前采纳的回答跟我一样没回答到点上,脑抽了

package.json 的 main 是方便 使用者 使用 你的代码

你的代码要使用其它仓库,还是要遵守一些规则。比如对方仓库的 package.json 也写好 main,并且符合你要求的模块管理方式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题