Open jtwang7 opened 1 year ago
当你使用 npm 包的形式去引入模块时,IDE 往往会提示你缺少 ts 文件。
import foo from 'foo'
这是因为程序运行时,会根据以下路径搜索 npm 包对应的 types 声明文件:
node_modules/@types/foo
node_modules/foo/index.d.ts
node_modules/foo/package.json 当中定义的typing或者types2个字段中的一个
node_modules/foo/package.json 当中定义的main入口文件相同文件名的声明文件,例如index.js / index.d.ts,如果typings或者types存在的话,是不会去找main入口当中同文件名的声明文件的
若所有搜索路径均遍历还是未找到文件,则程序报错。因此,在打包发布时,要明确 .d.ts
文件的打包输出路径,确保其路径可以通过以上途径查询。
如果这个 npm 包没有提供声明文件,那么这个时候就需要自己去写声明文件。推荐大家在自己项目目录里面单独建一个types文件夹来存放相关的声明文件。但是依据上面的规则,TS是没法找到我们给这个 npm 包书写的声明文件的。所以需要通过tsconfig.json文件进行指定:
{
"compilerOptions": {
"baseUrl": "./", // 解析的基础目录
"paths": {
"*": ["types/*"]
}
}
}
通过这样的配置后(具体有关baseUrl和paths字段的配置请参考文档),foo模块的声明文件除了会去node_modules目录下找,还会去当前项目的types/foo目录下去找:
projectRoot
├── src
│ └── index.ts
├── types
│ └── foo
│ └── index.d.ts
└── tsconfig.json
tsconfig.json
配置{
"compilerOptions": {
// ......
"declaration": true,
"declarationDir": "build/types"
},
// ......
}
declaration
: 在打包编译时,输出声明文件declarationDir
: 声明文件的输出地址package.json
配置{
"types": "build/types/index.d.ts",
// ......
}
types
: 依赖包执行时所需声明文件的主入口peerDependencies 在我们进行一些插件开发的时候会经常用到,比如 jQuery-ui 的开发依赖于 jQuery,html-webpack-plugin 的开发依赖于 webpack等。 假设现在有一个 helloWorld 工程,已经在其 package.json 的 dependencies 中声明了 packageA,有两个插件 plugin1 和 plugin2 他们也依赖 packageA,如果在插件中使用 dependencies 而不是 peerDependencies 来声明 packageA,那么 $ npm install 安装完 plugin1 和 plugin2 之后的依赖图是这样的:
.
├── helloWorld
│ └── node_modules
│ ├── packageA
│ ├── plugin1
│ │ └── nodule_modules
│ │ └── packageA
│ └── plugin2
│ │ └── nodule_modules
│ │ └── packageA
从上面的依赖图可以看出,helloWorld 本身已经安装了一次packageA,但是因为因为在 plugin1 和 plugin2 中的 dependencies 也声明了 packageA,所以最后 packageA 会被安装三次,有两次安装是冗余的。 🔥 而 peerDependency 就可以避免类似的核心依赖库被重复下载的问题。
如果在 plugin1 和 plugin2 的 package.json 中使用 peerDependency 来声明核心依赖库,例如:
plugin1/package.json
{
"peerDependencies": {
"packageA": "1.0.1"
}
}
plugin2/package.json
{
"peerDependencies": {
"packageA": "1.0.1"
}
}
在主系统中声明一下 packageA:
helloWorld/package.json
{
"dependencies": {
"packageA": "1.0.1"
}
}
此时在主系统中执行 $ npm install 生成的依赖图就是这样的:
.
├── helloWorld
│ └── node_modules
│ ├── packageA
│ ├── plugin1
│ └── plugin2
可以看到这时候生成的依赖图是扁平的,packageA 也只会被安装一次。
🔥 因此我们总结下在插件使用 dependencies 声明依赖库的特点:
发布你专属的 UI Library ( with Rollup)
参考文章:
步骤 (以 React 为例)
1. 创建项目
👉 (可选) 关联 github 仓库
2. 引入第三方库
3. 配置 Rollup
👉 安装 Rollup
👉 安装 Rollup 插件
🔥 配置
rollup.config.js
在项目根目录下创建rollup.config.js
配置文件,rollup 会根据该文件配置进行打包。4. 修改
package.json
配置🔥 package.json docs
😃 常用
package.json
字段配置说明name
: npm 包名version
: npm 包版本号files
: npm 包作为依赖关系被安装时,被宿主程序加载的文件资源。main
: 依赖包执行的主入口types
: 依赖包执行时所需声明文件的主入口😃 dependencies、devDependencies和peerDependencies区别
peerDependencies: 指定当前模块所在的宿主环境所需要的模块及其版本
若宿主环境安装的包不符合要求,则会打印警告提示,可以最大限度的保证插件和宿主共用一套环境(版本)。
与各打包工具的 external 字段 (例如 rollup.config.js - external) 结合,可保证最终打包编译的文件不包含 peerDependencies 中的包含的包。
5. 修改
tsconfig.json
配置6. 运行自定义打包脚本
7. 发布 npm 包
第一次发包:在根目录下,运行
npm adduser
,输入你的账号密码及email,如果开启了OTP验证则需要输入一次你的OTP密码。不是第一次发包:运行
npm login
命令登陆后发包。