main 告诉被依赖项目本库的入口文件
若是ts 项目,则types也不能少,它告诉被依赖项本库的d.ts,否则被依赖项目会报缺少类型定义文件,要求安装@types/等
files 最好也写上,npm在发布时会只发布指定的目录,否则会把src等所有东西全发到npm仓库去
先到npm login 登录一下, 需要输入用户名,密码,邮箱 此时若有错误可能是 npm 源不对, 比如原先切到了淘宝的源https://registry.npm.taobao.org/ 这时就得改回来,处理方法 npm config set registry https://registry.npmjs.org/
线上已经存在同名的包了,这种只需要修改项目名就ok了
邮箱没认证,这种需要打开https://registry.npmjs.org/ 网站,登录后,打开到 Account, change email, 然后新的邮箱就能收到认证邮件了,点击邮件中的认证链接即可
全局安装typescript , 用 npm install typescript -g (注意:不要装成node-typescript)网络不通的话需要切换源 npm config set registry https://registry.npm.taobao.org/
装好后为确保以后正常npm publish ,最好再切回默认源 https://registry.npmjs.org/
tsconfig.json 文件配置 declaration 打出d.ts 文件 outDir 输出目录 noEmit 不输出(由其它,如babel 等处理后输出)
实际开发中还没有用到tsc命令行生成, 是自己写的d.ts 文件补充到打出的包中去
output 中的 filename 输出名中不需要插入类似[contenthash:8]的字符
output 中的chunkFilename 也不需要(暂时不考虑分块)
output 还需要增加 library (库名,和package.json的name一致)和 ibraryTarget(模块类型,一般umd够用),缺少它们时,使用App会无法引入库中的组件
import_test分支中src/build_bak 目录下存放的就是libraryTarget取不同值后打出的bundle, App.tsx用以测试不同模块系统打出的包如何被引入
解决办法是首先将react,react-dom, 移入peerDependencies和devDependencies使用安装时react,react-dom 不会装多份(可以用 npm ls react 查看依赖树, npm ls查看整棵依赖树)
然后再用webpack配置中的 external 选项,去掉打出包中包含的react,react-dom,配置方法:
externals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
}
},
让使用的App无须再装依赖库的依赖是否可行?
现已经证明可行!
那么d.ts 文件要如何生成,类似的打出像antd里的 lib, es 目录下.js 和 d.ts在一起文件结构,要如何做。
还是用tsc, tsconfig.json中 "noEmit"设置为false,再设置一个"outDir"项,让ts翻译的结果生成到另一目录,package.json中的"types"可以指定d.ts文件的入口文件
目前只能依靠一个插件 esm-webpack-plugin, 地址:https://github.com/purtuga/esm-webpack-plugin
但是作者也不能保证用它打出的esm的包能否被别的App引入后,再用webpack来做 treeshake