npm发布过滤核心靠files白名单机制,仅显式声明的文件路径(如"dist"、"lib"、"index.js")会被发布,.npmignore不推荐作主控,且npm内置硬编码规则(如.git、.DS_Store)无条件忽略。

npm 发布时过滤不必要的文件,核心靠的是白名单机制——默认只发布极少数基础文件(如 package.json、README.md、LICENSE),其余所有内容都必须显式声明才能包含。不靠“删什么”,而靠“留什么”。
用 package.json 的 "files" 字段精准控制
这是最推荐、最可靠的方式。在 package.json 中添加 files 数组,列出你希望发布的路径或通配模式:
-
"files": ["dist", "lib", "index.js", "types"]—— 只发编译产物和类型定义 -
"files": ["src/index.ts", "README.md", "LICENSE"]—— 仅发源码入口和必要文档(适合 TS 工具库) - 支持 glob:如
"dist/**/*"、"*.json",但不支持**/*.test.js这类深层排除写法 - ⚠️ 一旦设置了
files,它就是唯一生效的白名单;.gitignore或.npmignore中没写的文件,只要不在files里,一律不发布
避开 npm 内置硬编码忽略规则
npm 会在打包前无条件过滤一批文件(优先级最高,无法被 .npmignore 取消):
- 常见被删的:
.git、.DS_Store、npm-debug.log、.svn、.hg、.npmrc、config.gypi、CVS - ⚠️
src目录本身不在这个列表里,如果你发现src没发布,大概率是files字段漏写了它,或存在空的.npmignore导致.gitignore失效 - 这些规则无法绕过,也不建议尝试覆盖——它们是安全底线,比如防止把本地配置或编辑器临时文件传上去
验证发布内容,别等 publish 后才发现
执行 npm pack --dry-run(npm v8.15+)或 npm pack && tar -tzf your-package-*.tgz,直接看到即将上传的压缩包结构:
立即学习“Java免费学习笔记(深入)”;
- 如果输出里没有你期望的
dist/index.js,立刻检查files是否包含"dist" - 如果看到不该出现的
tests/或scripts/deploy.js,说明它们被意外包含进files了,需要收紧路径 - 这个步骤比
npm publish安全得多,是上线前必做动作
不推荐用 .npmignore 做主控
.npmignore 类似 .gitignore,但它优先级高于 .gitignore,且行为容易反直觉:
- 即使
.npmignore是空文件,也会阻止 npm 回退使用.gitignore - 它本质是黑名单,而发布逻辑天然适合白名单(更可控、更易审计)
- 除非你要临时屏蔽某个已列入
files的个别文件(极少见),否则不必创建它


















