疑问
react虽然同时提供了commonjs导出和esm导出,但是其esm导出的文件仍然是commonjs的,在并未经过任何转译的情况下,为什么能直接使用import具名导入它呢?在index.mjs中具名导入本地的commonjs模块会出错,我仿照react做了一个模块也是报错
复现
仅安装react
npm i react
index.mjs
import { version } from "react"; console.log(version)
执行
node index.mjs
结果
成功打印react版本
其他信息
react的package.json
{ "main": "index.js", "exports": { ".": { "react-server": "./react.shared-subset.js", "default": "./index.js" }, "./package.json": "./package.json", "./jsx-runtime": "./jsx-runtime.js", "./jsx-dev-runtime": "./jsx-dev-runtime.js" } }
react的index.js
'use strict'; if (process.env.NODE_ENV === 'production') { module.exports = require('./cjs/react.production.min.js'); } else { module.exports = require('./cjs/react.development.js'); }
`
破案了,node现在原生支持在esm中import一个cjs模块,详见https://nodejs.org/dist/latest-v18.x/docs/api/esm.html#intero...。测试了一下,好像只支持模块,不支持本地导入。