当前位置: 首页 > 编程日记 > 正文

npm包发布记录

下雪了,在家闲着,不如写一个npm 包发布。简单的 npm 包的发布网上有很多教程,我就不记录了。这里记录下,一个复杂的 npm 包发布,复杂指的构建环境复杂。

整个工程使用 rollup 来构建,其中会引进 babel 来转译 ES6,利用 Eslint 来规范代码的书写风格,最后代码的发布会经过 terser 压缩。同时发布 umd、es 格式的版本以供外部调用。

完整目录结构如下:
工程结构

下面是整个过程的记录

一、初始化工程


yarn init -y

初始化后,修改 package.json 内容,如 name(项目名),description(项目描述)等信息。

二、安装 rollup


yarn add rollup@1.0.0 --dev

三、创建配置文件 rollup.config.js


export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'}
}

四、安装 babel


yarn add rollup-plugin-babel@4.2.0 @babel/core@7.2.2 @babel/preset-env@7.2.3 --dev

五、配置 babel

1、创建配置文件 .babelrc


{"presets": [["@babel/preset-env",{"modules": false}]]
}

2、与 rollup 集成,在 rollup.config.js 中配置 plugins


import babel from 'rollup-plugin-babel'export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'},plugins: [babel({exclude: 'node_modules/**',runtimeHelpers: true})]
}

六、安装 eslint


yarn add eslint@5.11.1

七、配置 eslint

1、生成 eslint 配置


.\node_modules\.bin\eslint --init

2、与 rollup 集成,在 rollup.config.js 中配置 plugins


import babel from 'rollup-plugin-babel'
import { eslint } from 'rollup-plugin-eslint'export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'},plugins: [eslint({include: ['src/**'],exclude: ['node_modules/**']}),babel({exclude: 'node_modules/**',runtimeHelpers: true})]
}

八、commonjs 兼容


yarn add rollup-plugin-commonjs@9.2.0 rollup-plugin-node-resolve@4.0.0 --dev

九、与 rollup 集成,在 rollup.config.js 中配置 plugins


import babel from 'rollup-plugin-babel'
import { eslint } from 'rollup-plugin-eslint'
import resolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'},plugins: [resolve({jsnext: true,main: true,browser: true}),commonjs(),eslint({include: ['src/**'],exclude: ['node_modules/**']}),babel({exclude: 'node_modules/**',runtimeHelpers: true})]
}

十、安装 terser, 用来压缩代码


yarn add rollup-plugin-terser@4.0.0 --dev

十一、与 rollup 集成,在 rollup.config.js 中配置 plugins


import babel from 'rollup-plugin-babel'
import { eslint } from 'rollup-plugin-eslint'
import resolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import { terser } from 'rollup-plugin-terser'export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'},plugins: [resolve({jsnext: true,main: true,browser: true}),commonjs(),eslint({include: ['src/**'],exclude: ['node_modules/**']}),babel({exclude: 'node_modules/**',runtimeHelpers: true}),terser()]
}

十二、引入环境变量,实践差异化打包

1、安装插件


yarn add rollup-plugin-replace@2.1.0 --dev

2、配置 plugins


import babel from 'rollup-plugin-babel'
import { eslint } from 'rollup-plugin-eslint'
import resolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import { terser } from 'rollup-plugin-terser'
import replace from 'rollup-plugin-replace'export default {input: 'src/index.js',output: {file: 'index.common.js',format: 'umd',name: 'index'},plugins: [resolve({jsnext: true,main: true,browser: true}),commonjs(),eslint({include: ['src/**'],exclude: ['node_modules/**']}),babel({exclude: 'node_modules/**',runtimeHelpers: true}),    replace({exclude: 'node_modules/**',ENVIRONMENT: JSON.stringify(process.env.NODE_ENV)}),terser()]
}

十三、参数化配置,加入版权说明,最终配置如下


import resolve from 'rollup-plugin-node-resolve'
import commonjs from 'rollup-plugin-commonjs'
import { eslint } from 'rollup-plugin-eslint'
import babel from 'rollup-plugin-babel'
import replace from 'rollup-plugin-replace'
import { terser } from 'rollup-plugin-terser'const pJson = require('./package.json')const version = pJson.version
const license = pJson.licenseconst banner ='/*!\n' +` * ${pJson.name} v${version}\n` +` * (c) 2018-${new Date().getFullYear()}\n` +` * Released under the ${license} License.\n` +' */'const ENV = process.env.NODE_ENV.trim()const paths = {input: {root: 'src/index.js'},output: {root: 'dist/'}
}const fileNames = {development: 'index.common.js',production: 'index.common.js',production6: 'index.esm.js'
}
const fileName = fileNames[ENV]export default {input: `${paths.input.root}`,output: {file: `${paths.output.root}${fileName}`,format: ENV === 'production6' ? 'es' : 'umd',name: 'index',banner},plugins: [resolve({jsnext: true,main: true,browser: true}),commonjs(),eslint({include: ['src/**'],exclude: ['node_modules/**']}),babel({exclude: 'node_modules/**',runtimeHelpers: true}),replace({exclude: 'node_modules/**',ENVIRONMENT: JSON.stringify(process.env.NODE_ENV)}),ENV && ENV.includes('production') && terser({ output: { comments: /^!/ } })]
}

三、业务代码编写

在 src/index.js 中编写具体业务代码

四、打包

在 package.json 中添加


"scripts": {"dev": "set NODE_ENV=development && rollup -c","build": "yarn run buildcjs && yarn run buildesm","buildcjs": "set NODE_ENV=production && rollup -c","buildesm": "set NODE_ENV=production6 && rollup -c"
}

运行命令


yarn run build

五、发布


npm publish

发布前记得记得 注册 帐号,记得修改 package.json 中 private 字段为 false


"private": false

后记:rollup-plugin-uglify@6.0.0 在 rollup@1.0.0 时有警告,文章中原 rollup-plugin-uglify 被替换成 rollup-plugin-terser

相关文章:

设计模式之单例模式(Singleton)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式)&#xff1…

关于知识蒸馏,这三篇论文详解不可错过

作者 | 孟让转载自知乎导语:继《从Hinton开山之作开始,谈知识蒸馏的最新进展》之后,作者对知识蒸馏相关重要进行了更加全面的总结。在上一篇文章中主要介绍了attention transfer,FSP matrix和DarkRank,关注点在于寻找不…

设计模式之建造者模式(生成器模式、Builder)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式…

[置顶] webservice系列2---javabeanhandler

摘要:本节主要介绍以下两点,1.带javabean的webservice的开发和调用 2.handler的简单介绍及使用1.引言在之前的一篇博客webservice系列1---基于web工程上写一个基本数据类型的webservice中介绍了如何采用axis1.4来完成一个简单的webservice的开发流程(入参…

AI教育公司物灵科技完成战略融资,商汤科技投资

1月2日消息,从相关媒体报道,AI教育公司物灵科技近日完成了商汤的战略融资,本轮融资将用于产品迭代和扩大市场。 此前投资界曾报道,物灵科技已经获得1.5亿元Pre-A轮融资,当时具体资方未透露。 公开资料显示&#xff0…

Python之父发文,将重构现有核心解析器

原题 | PEG Parsers作者 | Guido van Rossum译者 | 豌豆花下猫转载自 Python猫(ID: python_cat) 导语:Guido van Rossum 是 Python 的创造者,虽然他现在放弃了“终身仁慈独裁者”的职位,但却成为了指导委员会的五位成员…

全面支持三大主流环境 |百度PaddlePaddle新增Windows环境支持

2019独角兽企业重金招聘Python工程师标准>>> PaddlePaddle作为国内首个深度学习框架,最近发布了更加强大的Fluid1.2版本, 增加了对windows环境的支持,全面支持了Linux、Mac、 windows三大环境。 PaddlePaddle在功能完备的基础上,也…

设计模式之原型模式(Prototype)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式…

NFS共享服务挂载时出现“access denied by server while mounting”的解决方法

笔者用的Linuxf发行版本为Centos6.4,以下方法理论上讲对于Fedora, Red Hat均有效: 搭建好NFS服务后,如果用以下的命令进行挂载: # mount -t nfs 172.16.12.140:/home/liangwode/test /mnt 出现如下错误提示: mount.nf…

设计模式之桥接模式(Bridge)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式…

原360首席科学家颜水成正式加入依图科技,任首席技术官

7 月 29 日,依图科技宣布原 360 首席科学家颜水成正式加入,担任依图科技首席技术官(CTO)一职。依图方面称,颜水成加入后将带领团队进一步夯实依图在人工智能基础理论和原创算法方面的技术优势,为依图在商业…

分布式存储fastdfs安装使用

1.下载地址https://github.com/happyfish100/fastdfshttps://github.com/happyfish100/fastdfs/wiki安装辅助说明文档2.安装编译环境yum install git gcc gcc-c make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y三台主机&#xff1a…

Hibernate学习(九)———— 二级缓存和事务级别详讲

序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例。之后就会在去讲SSM,在之后我自己的个人博客应该也差不多可以做出来了。基本上先这样…

超详细中文预训练模型ERNIE使用指南

作者 | 高开远,上海交通大学,自然语言处理研究方向最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对之后还是觉得百…

linux内核SMP负载均衡浅析

需求 在《linux进程调度浅析》一文中提到,在SMP(对称多处理器)环境下,每个CPU对应一个run_queue(可执行队列)。如果一个进程处于TASK_RUNNING状态(可执行状态),则它…

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需…

超全!深度学习在计算机视觉领域的应用一览

作者 | 黄浴,奇点汽车美研中心首席科学家兼总裁转载自知乎简单回顾的话,2006年Geoffrey Hinton的论文点燃了“这把火”,现在已经有不少人开始泼“冷水”了,主要是AI泡沫太大,而且深度学习不是包治百病的药方。计算机视…

SHAREPOINT2010数据库升级2013

在作TEST-SPCONTENT命令时,会提示认证方式不一样。 The [SharePoint - 80] web application is configured with claims authentication mode however the content database you are trying to attach is intended to be used against a windows classic authentic…

设计模式之简单工厂模式(Simply Factory)摘录

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的…

别得意,你只是假装收藏了而已

今天分享我在看罗振宇的《2018 时间的朋友》演讲视频记下的一些思考。跨年演讲中有过这样的一个来自印象笔记的片段,列举了几组对比来说明: 『你在朋友圈里又佛又丧,你在收藏夹里偷偷地积极向上。』 扎心了,这不就是说我吗&#x…

Exchange2003-2010迁移系列之四,配置第一台Exchange CAS/HUB服务器

配置第一台CAS/HUB关于Cas/hub的配置请大家详见前面关于Ex2010的部署(两个配置基本相同在这里就不做详细的解说了)下面关于Cas的配置在前面已经提到了但是下面是另一种新的方法大家就看看吧生产环境中部署Exchange2010服务器时,是需要按照一定…

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

JAVA方法中的参数用final来修饰的效果

很多人都说在JAVA中用final来修饰方法参数的原因是防止方法参数在调用时被篡改,其实也就是这个原因,但理解起来可能会有歧义,我们需要注意的是,在final修饰的方法参数中,如果修饰的是基本类型,那么在这个方…

2019世界机器人大赛圆满落幕,荆州中学等15支队伍获「全能奖」

7月28日,2019世界机器人大赛总决赛在河北保定圆满落下帷幕。保定市市委常委罗德强、中国电子学会副秘书长梁靓、保定市政府秘书长王保辉、保定市政府副秘书长安利文、保定市徐水区区长李志永、保定市莲池区政府党组副书记赵建军、世界机器人大赛组委会秘书长李洋、长…

在任何设备上都完美呈现的30个华丽的响应式网站

如今,一个网站只在桌面屏幕上好看是远远不够的,同时也要在平板电脑和智能手机中能够良好呈现。响应式的网站是指它能够适应客户端的屏幕尺寸,自动响应客户端尺寸变化。在这篇文章中,我将向您展示在任何设备上都完美的30个华丽的响…

设计模式之装饰模式(Decorator)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

解决流程自动化“最后一公里问题”,达观数据发布智能 RPA

2019 年7月 26 日,业界领先的人工智能企业达观数据在北京召开“达道至简”为主题的产品发布会,正式推出国内首款自主研发集OCR(光学字符识别)与 NLP(自然语言处理)于一体的达观智能RPA。达观数据创始人兼CEO陈运文、副总裁金克、贾学锋和联合创始人高翔携…

利用脚本生成GUID

实际上,可以使用一种非常简单的方法来生成 GUID,但这种方法近乎像是作弊。(您可听清楚了,我们说的可是“近乎”。)“Scriptlet.TypeLib”对象的设计用途是帮助您创建“Windows 脚本组件”(实质上&#xff0…

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

快速开发生命周期支持工具

去年有幸研究公司管理产品的软件平台,当时考虑的产品是基于业务模型之上的一个系统平台,从建模到运行、部署、维护全生命周期管理.当时就提出两个希望先实践解决的就是可复用原型的设计和使用工作流和规则引擎的协作处理询标产品.前一阵子在公司研究成本产品的成本分析和算法,一…