在 npm publish 的时候你是如何过滤文件的呢?
一般模块目录下会存在一些文件或目录是不想被发布的,比如 coverage, node_modules,test 等,如果发布了这些文件,会让包的体积变大,导致下载缓慢。npm 内置了一些过滤的白名单,比如 node_modules
,还会根据 .gitignore
进行过滤。
npm 还提供了两种方式让开发者过滤文件 npmignore 和 pkg.files.
推荐 pkg.files
推荐使用 pkg.files 来过滤文件,和 npmignore 最大的差异就是使用白名单。npmignore 文件通过配置一个黑名单列表,当 npm publish 时这些文件不被发布。但是当新增配置文件或某些工具生成临时文件时,这个黑名单就会收到影响。
而 pkg.files 通过白名单的方式,只发布配置的文件或目录,比如
{
"files": [
"index.js",
"lib"
]
}
你可以通过 pkgfiles 来查看真实被发布的文件。
自动生成 pkg.files
但有时候会发现漏配 pkg.files 的情况,导致使用的时候部分文件不存在。
你可以使用 ypkgfiles 来自动生成 pkg.files,直接运行 ypkgfiles
就可以了。
ypkgfiles 的原理非常简单,通过 main 入口找到所有的相对依赖,然后获取第一层的文件或目录就能生成 pkg.files 了。
ypkgfiles 还提供 --entry
参数来支持一些特定的场景,比如以下场景无法被 ypkgfiles 识别
- 比如某个目录是模板文件,不是通过 require 加载的
- 如 mz 模块使用
require('mz/fs')
的方式,并且这个文件不被 main require。 - egg 的目录是由 egg loader 加载的
使用 --entry
来添加这些文件或目录,比如 egg 项目
$ ypkgfiles --entry app --entry config --entry *.js
总结
最佳的目录结构是 index.js
+ lib
,不要把过多的文件或目录放置到根目录,再配合 ypkgfiles 自动生成可以让发包更简单。
哈哈