新发布NPM包内部及外部导入失败,求排查解决
问题梳理
首次发布NPM包ef-vue-crust,npm publish和npm install流程正常,但出现两个核心问题:
- 包内
index.js无法找到./lib/session.js,报错:
Module not found: Error: Can't resolve './lib/session.js' in 'C:\Projects\my-app\node_modules\ef-vue-crust'
- 外部应用直接导入
data-types下文件失败,使用import Point from '@ef-vue-crust/data-types/point.js';时出现相同找不到文件的错误。
包文件结构:
- index.js, etc - /lib -- connection.js -- session.js -- /data-types --- point.js, etc
当前index.js代码:
import Connection from "./lib/connection.js" import Session from "./lib/session.js" export default { Connection, Session, }
当前package.json关键配置:
{ "name": "ef-vue-crust", "type": "module", "main": "index.js", "exports": { "." : "./index.js", "./data-types/": "./lib/data-type/*.js" }, ... }
错误原因与修复方案
1. 路径拼写错误(核心问题)
package.json的exports中,./data-types/指向的路径是./lib/data-type/*.js,但实际目录是/lib/data-types(复数形式,多了一个s),导致解析路径不匹配。
修复:
修正exports中的路径:
{ "exports": { "." : "./index.js", "./data-types/": "./lib/data-types/*.js" } }
2. 导出方式不匹配
你在index.js中用export default导出一个对象,但外部使用import {Connection} from 'ef-vue-crust'这种命名导入的方式,会导致无法正确获取到Connection。因为default导出的是一个整体对象,命名导入需要对应命名导出。
修复:
修改index.js为命名导出:
import Connection from "./lib/connection.js"; import Session from "./lib/session.js"; export { Connection, Session };
3. 直接导入的路径错误
你的包名是ef-vue-crust,并非scoped包(scoped包格式是@scope/package-name),所以直接导入时不需要加@符号。
修复:
将导入语句改为:
import Point from 'ef-vue-crust/data-types/point.js';
4. 确认文件已被正确发布
检查package.json的files字段,确保包含所有需要发布的文件。如果没有files字段,默认会发布除了.gitignore、.npmignore中列出的文件之外的所有文件,但为了保险起见,显式声明:
{ "files": [ "index.js", "lib/" ] }
修改后重新执行npm publish,确保node_modules/ef-vue-crust下存在完整的lib目录和对应文件。
验证修复
- 重新发布包:修改完上述内容后,更新版本号(
npm version patch),再执行npm publish。 - 在应用中重新安装:
npm install ef-vue-crust。 - 测试导入:
- 基础导入:
import { Connection } from 'ef-vue-crust'; - 直接导入data-types:
import Point from 'ef-vue-crust/data-types/point.js';
- 基础导入:
内容的提问来源于stack exchange,提问作者Randy Hall

