NPM模块内部如何从自身入口index.js导入其他共导出的模块?
问题原因
Node默认的模块解析逻辑会把@myscope/blurfl这类带作用域的导入路径,当做第三方依赖去node_modules目录下查找,你自己开发的包没有安装到自身的node_modules中,自然会报找不到模块的错误。
可行的解决方案
- 方案1:使用Node原生
imports字段(无需额外依赖,Node 14.13+/16+支持)
这是纯Node运行场景最推荐的解法,直接在你的@myscope/blurfl包根目录的package.json中添加imports配置,告诉Node模块解析器内部自引用的路径映射即可:
配置完成后,你在包内任意文件都可以直接用{ "name": "@myscope/blurfl", "imports": { "@myscope/blurfl": "./index.js" } }import { A } from '@myscope/blurfl'导入导出项,不需要再写相对路径,后续调整导出文件的位置也只需要修改index.js的导出逻辑即可。该配置不会影响外部用户安装使用你的包,发布到npm后完全兼容正常导入逻辑。 - 方案2:配置构建工具别名(适用于有webpack/vite/rollup等构建流程的项目)
如果你的项目需要经过前端构建工具打包,也可以给工具配置路径别名实现同样效果,以Vite为例,在vite.config.js中添加如下配置:
其他构建工具的别名配置逻辑基本一致,只需要把import { defineConfig } from 'vite' import { fileURLToPath, URL } from 'node:url' export default defineConfig({ resolve: { alias: { '@myscope/blurfl': fileURLToPath(new URL('./index.js', import.meta.url)) } } })@myscope/blurfl指向你包根目录的index.js即可。 - 不推荐方案:本地安装自身包
可以在包根目录运行npm install .把当前包安装到自身的node_modules目录下,即可正常解析导入路径,但每次修改导出逻辑后都需要重新执行安装命令,非常不方便,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者Bluby
相关产品推荐
相关产品推荐

