如何发布一个 npm 包
一 背景
在工作时,突然接到经理的一个要求,需要将一个react的高阶组件函数封装成一个npm包。之前从没弄过,当场还是有些懵逼的,但是这毕竟是工作,不能推脱。于是开始了学习、汤坑之旅。最终包发布,线上项目成功使用,虽然导致了一次线上故障,但还是快速地fix掉。吃一堑长一智,记录一下整个发布的过程和遇到的一些问题。
二 流程
npm 包可以将可复用逻辑封装成一个工具库,依赖 npm 的强大生态,可以在项目中引入,让代码变得更加简洁,提高效率。
- 在 npm 官网注册一个账号。
- 在本地登录 npm 账号。
- 编写 npm 包内容。
- 发布包。
三 开发过程
1 注册npm账号。附录网站: https://www.npmjs.com/
2 在本地登录npm账号。
npm login
输入在npm官网注册的账号密码即可。
3 编写npm包
3.1 执行以下命令,创建一个npm模块
mkdir npmDir
cd npmDir
npm init -y
3.2 安装webpack
npm install webpack webpack-ci -D
在本地开发时,通常考虑更多的是代码的可读性,以便于在逻辑出错时,可debug其源码找到问题。然而发至线上时,则考虑更多的是包的体积,越小即代表着更快的载入。
同时,一个强大的包应该支持多种方式导入,例如es module的import,commonjs的require以及amd的古老方式。
为做到以上两点,选择了webpack作为构建工具。虽然用webpack个人感觉稍微有点重,但是它可扩展性强,日后利用loader以及plugin可以实现更多的编译以及优化需求。
3.3 梳理项目目录

src下的index.js对应着包的内容。
最外层index.js为所暴露的出口文件。
dist目录存放webpack打包后的文件。
3.4 编写对应内容
3.4.1 webpack.config.js

mode 为支持开发版代码不压缩,线上版本压缩。此处将mode设置为'none',默认全不压缩,然后自己用插件来配置压缩代码文件。
entry设置两个入口,add为在开发时导入,add.min文件为在线上时导入。
output设置。
- filename: 设置占位符。默认为entry入口文件名字
- library: 库的返回值赋值给变量或者属性 add。例如script引入方式,则可以全局使用add函数。此属性和library配合使用
- libraryTarget: 变量暴露的方式。设置为umd即可支持es module、cmd以及script引入脚本的方式使用。
- libraryExport: 配置要导出的模块中那些子模块需要被导出。只有output.libraryTarget被设置成commonjs或者commonjs2的时候才有效。我的导出方式是export default,因此我将其直接导出。如果不填此项,则默认引入的是module对象。调用方式会是 .default形式。
optimization设置
利用TerserPlugin插件进行压缩代码,默认只压缩.min结尾的输出文件。
3.4.2 模块主要内容 src/index.js

简单的一个测试函数
3.4.3 main入口文件index.js

根据环境变量自动引入相关版本。
3.4.4 构建命令。package.json

发布包时可以手动执行build命令后后发布,也可通过prepublish钩子自动编译然后发布。
4 发布包
修改 package.json 中的name字段,即包在npm中的名字。小提示,想好名字之后,最好到npm官网上搜索一下这个包有没有被别人注册,有的话就要换一个了。
修改版本号,可手动修改,也可通过npm version命令进行更换。个人习惯于后面。
# 修改版本号
npm version major | minorr | patch
# 发布包到npm
npm publish
然后在npm官网上搜索一下,便可以找到你发布的包了。开心。
四 遇到的问题
4.1 在服务端渲染(ssr)的项目中引入该包时,会报错误 ”window is not defined“
本以为是包中代码逻辑错误,把项目中所有引入到window的地方全都用typeof兼容了一遍,本想完事大吉,结果还是报这个错误。上网搜索各种帖子无效之后,我感觉是webpack编译打包后出了问题,于是报着试一试的心态去看编译后的未压缩版本代码,果然发现了问题。

如图所示,打包后的文件为一个自运行匿名函数,函数第一个实参竟然是window。
于是去webpack官网查看相关文档,看其是否能配置。果然找到了

修改globalObject属性,将第一个参数设置为this,解决问题。
如何发布一个 npm 包的更多相关文章
- 如何发布一个npm包(基于vue)
前言:工作的时候总是使用别人的npm包,然而我有时心底会好奇自己如何发布一个npm包呢,什么时候自己的包能够被很多人喜欢并使用呢...今天我终于迈出了第一步. 前提:会使用 npm,有 vue 基础, ...
- 从0到1发布一个npm包
从0到1发布一个npm包 author: @TiffanysBear 最近在项目业务中有遇到一些问题,一些通用的方法或者封装的模块在PC.WAP甚至是APP中都需要使用,但是对于业务的PC.WAP.A ...
- 发布一个npm包(webpack loader)
发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...
- (转)前端开发-发布一个NPM包之最简单易懂流程
原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...
- 如何发布一个npm包?
npm包在现在前端开发中经常使用且便利,而我也是经常使用,而没研究怎么去发布npm.那如何发布npm包呢? 一.在npm的官网上注册一个账号登录,https://www.npmjs.com/ 注意此步 ...
- webpack创建library及从零开始发布一个npm包
最近公司有个需求,我们部门开发一个平台项目之后,其他兄弟部门开发出的插件我们可以拿来直接用,并且不需要我们再进行打包,只是做静态的文件引入,研究一波后发现,webpack创建library可以实现. ...
- 发布一个npm包
前言 我这里是写了一个vue轮播图插件,因此我使用了vue的脚手架工具创建一个项目,当然你也可以选择自己搭建脚手架. 本例中我会使用vue脚手架创建一个项目,并发布到npm上面去. 通过脚手架创建项目 ...
- 如何发布一个包到npm && 如何使用自己发布的npm包 && 如何更新发布到npm的package && 如何更新当前项目的包?
如何发布一个包到npm First 在https://www.npmjs.com注册一个账号. Second 编辑好项目,文件大致如下: 其中,gitignore可以如下: .DS_Store nod ...
- 如何开发一个npm包并发布到npm中央仓库
转自: https://liaolongdong.com/2019/01/24/publish-public-npm.html 如何开发一个npm包并发布到npm中央仓库需求背景:平时在项目工作中可能 ...
随机推荐
- 说一说Web开发中两种常用的分层架构及其对应的代码模型
昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...
- C. Anton and Fairy Tale(数学推式子)
\(数学题,式子并不难推,但边界是真的烦\) \(\color{Red}{Ⅰ.其实可以发现,当m>=n时,每次都可以粮食补到n,所以一定是在第n天消耗完毕}\) \(\color{Purple} ...
- Three Blocks Palindrome (easy version)[暴力-预处理]
给定一个数组,找出最长的子序列,满足 a,a,..a,b,b,..b,a,a,..a 前面的a和后面的a都要是x个,中间的b是y个. 其中,x>=0且y>=0. \(\color{Red} ...
- 蓝桥杯2019初赛]迷宫(dfs版本)
传送门 大意: 题目的意思还是模板的搜索,不同的是我们要记录路径了,而且是最短字典序最小的路径. 思路: 1.对于字典序最小,也就是说我们要尽量先往下走,然后是左- 这个很简单,因为在dfs中是顺序枚 ...
- ASR6505带MCU STM8L+SX1262内核LoRa芯片
LoRa是Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案.一种简单的能实现远距离.长电池寿命.大容量的系统,进而扩展传感网络,LoRaWAN,LinkWAN,MESH组网,自组网 ...
- Anaconda 常用命令大全
帮助目录 检查conda版本 升级当前版本的conda 创建一个新环境 激活新环境 Linux,Mac: Windows: 列出所有的环境 切换环境(activate/deactivate) Linu ...
- Dynamics 9.0 安装好后 公告出现 提示:出现错误。 请稍等片刻,然后重试。 如果问题仍然存在,请与管理员联系。
此问题为系统的Bug,示例图如下: 解决方案为修改存储过程 p_RetrievePosts,将startDate参数的默认值改成 1900-01-01,endDate参数的默认值改成 9999-12- ...
- python学习之变量以及变量/标识符/关键字
Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言,代码简洁,功能强大,是使程序员能够专注于解决问题而不是研究语言本身.接下来我们先从它的语法开始学起 1.首先要懂得python ...
- Spring Cloud 系列之 Config 配置中心(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...
- FPGA的“可编程”使你迷惑吗?
http://www.alteraforum.com.cn/showtopic-7791.aspx FPGA的“可编程”使你迷惑吗? 任何一个硬件工程师对FPGA都不会陌生,就好比C语言对于软件工 ...