前言:

工作了几年,想把一些不好找现成的库的常用方法整理一下,发布成npm包,方便使用。也学习一下开发发布流程。

主要用到的工具:npm。

开发库:babel、typescript、rollup、eslint、corejs。

由于目前只是发布一些函数方法,只需要一些兼容性工具,打包工具即可。

一、创建项目

可以直接在github上创建一个空项目,然后克隆到本地。

进入目录下,执行

npm initz

之后将开始初始化package.json:

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults. See `npm help init` for definitive documentation on these fields
and exactly what they do. Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file. Press ^C at any time to quit.
package name: (cs) csdrv
version: (1.0.0) 0.0.1
description: 描述内容
entry point: (index.js)
test command: 测试命令
git repository: git远程仓库
keywords: 描述这个包的关键词
author: axelccc
license: (ISC)
About to write to D:\LiFile\code\cs\package.json: {
"name": "csdrv",
"version": "0.0.1",
"description": "描述内容",
"main": "index.js",
"scripts": {
"test": "测试命令"
},
"repository": {
"type": "git",
"url": "git远程仓库"
},
"keywords": [
"描述这个包的关键词"
],
"author": "axelccc",
"license": "ISC"
} Is this OK? (yes) y

此时有了一个空项目。

二、编辑方法

新建src目录,用于存放源代码。新建dist目录,用于存放打包后的文件。新建test目录,用于某些测试方法。目录名称无要求。

新建函数文件hideStr.js,本例创建一个 脱敏字符的方法:

/**
* 脱敏字符返回
* 小数点前全脱敏,如果没有小数点,最多脱敏两位 脱敏与真实位数对应
* value 数值 hideLength 脱敏位数
*/ export function hideStr({ value = 0, hideLength = 2, replaceChar = "*" }) {
let hideStr = ""; if (typeof value != "number" && typeof value != "string") {
console.warn("需要输入数字或者字符串,否则结果将会异常");
} try {
const str = String(value);
const [integer, decimal] = str.split(".");
for (let i = integer.length - 1; i >= 0; i--) {
// 前 hidelength 位 换成 *
if (integer.length - i > hideLength) {
hideStr += integer[i];
} else {
hideStr += replaceChar;
} // 前 除了最后一位 每3位加一个 ,
if (i % 3 == 0 && i != 0) {
hideStr += ",";
}
} decimal && (hideStr += `.${decimal}`);
} catch (error) {
console.log(`脱敏异常`, error);
} return hideStr;
}

新建src/index.js,作为入口文件,引入上文的方法,并导出。此处index.js主要是起到归集作用。

import { hideStr } from "./hideStr";
import { separator } from "./separator";
import { unitByBit, unitByByte, unitToChinese } from "./unitFormat"; export { hideStr, separator, unitByBit, unitByByte, unitToChinese };

理论上,这个时候发布,是可以引入使用了,但是此时过于粗糙,存在测试做不了,不支持ts,没有构建编译后的文件等问题。

三、引入ts支持

如果不需要ts支持,可以跳过本步骤。该步骤主要是编辑ts描述文件,以增加ts提示信息等。

与index.js同级增加index.d.ts文件。

declare module "csdrv";
export { hideStr } from "./hideStr";
export { unitByByte, unitByBit, unitToChinese } from "./unitFormat";
export { separator } from "./separator";
export type { hideStrIn, sepIn, unitRes } from "./interface";

hideStr.d.ts

import { hideStrIn } from "./interface";
/**
* @return 脱敏后的字符串
*/
declare function hideStr({ value, hideLength, replaceChar }: hideStrIn): string; export { hideStr };

interface.d.ts 定义的一些接口规范

/**
* cn:对数字前几位脱敏
*/
interface hideStrIn {
// 被脱敏的数字
value: number | string;
// 保留字符的长度
hideLength?: number;
// 脱敏的代替字符
replaceChar?: string;
} /**
* cn:将数字进行 多位分隔,默认三位
*/
interface sepIn {
// 被处理的数字
num: number;
// 几位一分割
n?: number;
} /**
* cn:单位格式化 后返回的结构
* en:result after format
*/
interface unitRes {
value: number; // 要被格式化的数字
// 格式化之后的单位
unit: string;
} export { hideStrIn, sepIn, unitRes };

四、生成打包编译后文件

生成编译后的文件,可以方便引用。尝试rollup工具打包。

rollup和webpack类似,都是一类打包工具。为了兼容性,引入babel处理。注:需要的包不要忘记npm,也不要忘记添加corejs。

.babelrc文件简单配置:

{
"presets": [
[
"@babel/preset-env",
{
"modules": false,
"useBuiltIns": "usage",
"corejs": "2"
}
]
],
"plugins": [["@babel/plugin-transform-runtime"]],
"ignore": ["node_modules/**"]
}

根目录下创建rollup.config.js:

import resolve from "rollup-plugin-node-resolve"; // 依赖引用插件
import commonjs from "rollup-plugin-commonjs"; // commonjs模块转换插件
import babel from "rollup-plugin-babel"; // babel 插件
import { eslint } from "rollup-plugin-eslint"; // eslint插件 export default {
input: "./src/index.js", // 打包的入口文件
output: {
name: "csdrv", // 输入的包名
file: "./dist/csdrv.js", // 打包输出地址, 这里的导出地址就是package内main的地址
format: "umd", // 包类型
},
plugins: [
// 使用的插件
resolve(),
commonjs(),
babel({
exclude: "node_modules/**",
runtimeHelpers: true,
}),
eslint({
throwOnError: true,
include: ["src/**"],
exclude: ["node_modules/**"],
}),
],
ignore: [
"node_modules/**", // 忽略目录
],
};

package.json增加 build脚本命名:

  "scripts": {
"build": "rollup -c rollup.config.js",
},

执行 npm run build,即可生成构建后的csdrv.js。中间因为缺失依赖报错,请安装依赖。

五、完善readme.md,package.json信息

自述文件得写一下。

package.json可以额外追加一些参数:参考http://nodejs.cn/learn/the-package-json-guide。

或者找到一些开源项目参考一下。

六、本地测试

1.可以在test目录下创建测试脚本,正常引入即可。

2.使用npm link方式,在其它工程中引入。

七、发布

测试,引入没啥问题了,就大胆发布吧。

首先登录npm。

npm login

输入账号,邮箱,密码。

npm publish 即可发布。注:每次发布版本号不可一致,确认好再发。

最后:https://www.npmjs.com/package/csdrv ,万一以后能干掉lodash呢(大雾hh)。

开发并发布npm包,支持TypeScript提示,rollup构建打包的更多相关文章

  1. 创建并发布npm包

    1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站注册地址:https://www.npmjs.com/signup 2.命令行工具登录npm np ...

  2. 使用cnpm搭建私有NPM仓库 发布npm包

    关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记 ...

  3. 不会发布npm包?进来看看?

    前言 npm(Node Package Manager),一个Node的包管理器,平时我们常用的公共模块(插件)或者叫做包大多都放在上面,所以接下来要封装的插件,我们就简单称它为npm包,本文从就从这 ...

  4. 使用Vue-cli3.0创建的项目,如何发布npm包

    使用Vue-cli3.0创建的项目,如何发布npm包 在使用vue进行项目开发时,如果我们想要发布一个包,有时候会有点迷糊,不知道应该怎么修改脚手架的默认设置.这里记录一下一些常见的操作. 创建ind ...

  5. 前端组件用 Scope 发布 npm 包的方法

    1.引言 多人.多组织或多组件发布 npm 包到同一个仓库时,可能出现命名冲突问题. 为了解决这个问题,npm 引入了“scope”(范围)概念. 在 Angular 项目中,我们通常可以看到“@an ...

  6. 发布nuget包的正确姿势---cicd自动打包发布nuget包

    最轻便的发布nuget包方式,方便cicd自动打包发布nuget包 首先新建项目 项目名随便取,这里就叫它GuiH.ClassLibrary 默认即可,需要改目标版本时,等创建好再改 项目创建好了 随 ...

  7. 开发并发布依赖包,作为工具包供别人npm install

    1.初识包及 npm 包的概念: nodejs 中的第三方模块叫包 不同于 nodejs 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用 nodejs 中的包都是免费开源 ...

  8. 使用vuecli3发布npm包

    一.使用vuecli3创建项目 vue create svgicon 二.修改目录,开发组件前的准备 把src目录改为examples作为查看组件的演示目录,新建packages目录作为组件编写的目录 ...

  9. 用@vue/cli发布npm包

    1.环境准备 安装node,npm,@vue/cli 2.初始化项目 用@vue/cli创建新项目 vue create mtest-ui 删除public,main.js,App.vue等无关文件, ...

随机推荐

  1. 面试问题之C++语言:如何避免内存泄漏?

    转载于:https://www.php.cn/csharp-article-416104.html 1.不要手动管理内存,可以尝试在适用的情况下使用智能指针. 2.使用string而不是char*.s ...

  2. 有没有可能两个不相等的对象有有相同的 hashcode?

    有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突.相等 hashcode 值的规定只是说如果两个对象相等,必 须有相同的 hashcode 值, ...

  3. 什么是 Spring Framework?

    Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度.它是轻量级.松 散耦合的.它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序 开发提供了一个有凝聚力的框架.它可以集成其 ...

  4. 区分构造函数注入和 setter 注入?

    构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...

  5. 学习Cobbler(二)

    Server端: 第一步,启动Cobbler服务 第二步,进行Cobbler错误检查,执行cobbler check命令 第三步,进行配置同步,执行cobbler sync命令 第四步,复制相关启动文 ...

  6. C语言之关键字(知识点2)

    关键字又叫保留字,这些关键字不可以再次定义 解析

  7. 13_Invariance Principle_LaSalle's Theorem_不变性原理

  8. CSS3渐变效果工具

    推荐一个css3渐变效果工具,觉得有帮助的可以收藏下. 工具链接 CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡.CSS3 定义了两种类型的渐变(gradient ...

  9. html5知识点补充—footer元素的使用

    使用footer元素创建脚注 顾名思义,footer元素通常位于页面的底部.尽管footer通常位于某个区域或者页面的底部,但并非总是如此.footer元素旨在包含作者.网站所有者.版权数据.网站规章 ...

  10. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...