已经在 package.json 写了 main 字段,
但为什么还是得这样写才能正确引入
const axios = require('axios/dist/node/axios.cjs')
写了 main 字段 不是就能在 require 时自动找到模块入口吗?
已经在 package.json 写了 main 字段,
但为什么还是得这样写才能正确引入
const axios = require('axios/dist/node/axios.cjs')
写了 main 字段 不是就能在 require 时自动找到模块入口吗?
首先盲猜一下你是在 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')
上面语句不支持是因为require
是commonjs
规范,它无法正确解析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
,并且符合你要求的模块管理方式。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
如果在package.json文件中设置了main字段,那么通常情况下应该可以通过以下方式引入axios:
(1) 题主的情况应该是Node.js 版本可能不支持 ESM 模块。在这种情况下,尝试使用 CommonJS 格式来引入模块:
这种方式会直接引入 CommonJS 格式的模块,而不是 ESM 格式的模块。
(2) 另一种情况:项目依赖树中存在多个版本的axios,导致 Node.js 在解析模块时出现问题。可以使用
命令查看依赖树中是否存在多个版本的 axios,如果存在,可以尝试使用
命令将它们合并到同一个版本。
如果实在无法确定问题出现的原因,可以尝试重新安装 axios 模块,并清除缓存:
然后尝试再次引入模块,看看问题是否解决。