如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库
JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法
于是就创建了一个名为learnjts
的项目,在空余时间也写了几个工具函数,后续还会再继续增加...
这篇文章就是一篇实战文章,我把自己创建项目,发布到npm,以及遇到的问题和解决方案全都记录了下来,如果你也想创建一个自己的js工具库,可以根据这篇文章一步一步的尝试一下
创建项目
打开命令窗口,创建一个项目文件
mkdir learnjts // 创建了一个名为 learnjts 的文件夹
cd learnjts // 进入此文件夹
然后初始化项目
npm init
我们可以看到:让我们给项目起一个名字,括号内是默认文件夹的名字,不用修改,回车就可以 还会弹出来许多的参数,我们可以写上,也可以一路回车,一直到最后,就会生成一个package.json
文件夹 如果要修改可以直接在这里修改
创建一个src
文件夹,里面放一些js文件,可以写工具方法,再在根目录下创建一个index.js
作为入口文件
写工具方法
项目骨架已经建好了,接下来我们开始写工具方法
第一个工具方法,我写了一个数据类型的判断方法
先在src文件夹下面建一个getDataType.js
function getDataType(target){
let type = typeof target
// 判断是否是复杂数据类型
if(type === 'object'){
return Object.prototype.toString.call(target).replace(/^[object (\S+)]$/, '$1').toLowerCase();
}else{
// 基础数据类型直接返回
return type
}
}
//导出这个方法
export default getDataType
然后在index.js文件里导入 getDataType
方法,并且验证是否能够使用
然后就会发现,报错了
从报错信息我们可以看到是 import出错了
解决方案:给package.js
添加一个属性
"type":"module",
此时再运行一下可以看到,能够正常运行了
以后我们在src目录下肯定会增加很多工具函数,所以可以吧index.js
当成一个入口,所有的工具函数都可以从这里导出出去
import getDataType from './src/getDataType.js'
export {
getDataType,
}
注册npm账号
要想自己的工具库别人也能够使用,需要把它发到npm上 npm官网
此时就需要注册一个npm账号了
注册npm需要有一个邮箱,任何邮箱都可以,能接收到验证码就可以,注册时会收到验证码
开始发布
当你注册好npm账号后,你就可以去项目中准备 发布 了
设置npm源
但是在发布之前,需要检查一下npm源,如果是其他源,就会发布失败,此时你需要把它设置为npm源
在项目终端里输入npm config get registry
,可以查看当前源
npm config get registry
可以看到此时我的源是npm源,可以发布,如果是淘宝源呢?
就需要设置npm源
npm config set registry https://registry.npmjs.org/
登录npm账号
因为我们是第一次发布包,所以需要在终端登录我们的npm用户,输入我们的用户名,和密码和邮箱
在终端输入
npm adduser
需要注意的是,我们输入密码时,不会再终端上显示出来,输入完直接按回车就好
接着开始让你输入npm的邮箱号,再次按回车时,会给你的邮箱发一个验证码,你需要把这个验证码再输入上
发布到npm上
登录好后,开始发布,在终端输入
npm publish
发布的时候,有可能就会报错:提示信息就会问你:你没有登录对账号吧?
其实真正的错误原因:是因为你的项目名称和npm上的项目重名了
在起名字的时候,你可以去npm上搜一下 嘿嘿_ 这个其实是我之前写好的,只是为了给大家演示,又从零搭建又写了一遍
如果没有搜到,则说明你可以使用这个名字
如果你重名了,你就在package.js
里面改名吧
此时再次发布,就可以看到,发布成功了
回到npm,点击自己的头像,再点击Profile,就可以看到自己的npm库了
使用自己的工具库
新建一个项目,再建一个js文件
在终端输入npm install learnjts
npm install learnjts
安装成功可以看到我们的项目里多了几个文件 在index.js文件里引入工具函数
有可能还会报 import 引入错误,解决方案和上面一样
此时可以看到可以正常打印出来数据类型,则说明
添加eslint 和 单元测试
添加一个README.md文档,来介绍自己的工具库
添加 eslint
既然写都写了,肯定要最好最全面的配置呀,所以我决定添加eslint
两种安装方式,一般选择第二种在当前项目安装
//方式一.全局安装
npm i -g eslint
//方式二.当前项目安装
npm i -D eslint
使用命令配置并生成一个.eslintrc
文件
npm init @eslint/config
命令行会有一些简单的配置,生成如下内容
module.exports = {
"env": {
"browser": true,
"node": true,
"es2021": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
}
}
配置一下规则,可以在env里添加node,es6等
module.exports = {
"env": {
"browser": true,
"node": true,
"es6": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"space-before-function-paren": 0, // 函数定义时括号前面要不要有空格
"semi": 0, // 语句可以不需要分号结尾
"eqeqeq": 1, // 必须使用全等
}
}
可以在rules配置一些语法规则
module.exports = {
"rules": {
/*
"off" -> 0 关闭规则
"warn" -> 1 开启警告规则
"error" -> 2 开启错误规则
*/
"space-before-function-paren": 0, // 函数定义时括号前面要不要有空格
"semi": 0, // 语句可以不需要分号结尾
"eqeqeq": 2, // 必须使用全等
}
}
此时再回到 getDataType.js文件中去就会发现,没有使用全等的地方爆红了,修改后恢复到正常
添加单元测试jest
单元测试的执行通常需要测试规范、断言、mock、覆盖率工具等支持
jest 是用来创建、执行和构建测试用例的 JavaScript 测试库,自身包含了 驱动、断言库、mock 、代码覆盖率等多种功能
安装
npm i --save-dev jest
把 jest 安装到项目后,在 package.json 添加配置
"scripts": {
"test": "jest"
}
这样就可以使用命令 npm test 执行测试代码了 创建一个test/getDataType.test.js 文件来测试getDataType方法
import getDataType from '../src/getDataType.js';
test('getDataType(2)===number', () => {
expect(getDataType(2)).toBe("number");
})
test('getDataType({a:1})===object', () => {
expect(getDataType({a:1})).toBe("object");
})
此时你会发现,又有很多爆红
解决办法:在 「.eslintrc.cjs」 配置"jest": true
在jest原生测试框架中,无法使用es6的import export语法,只能使用commonJS语法,可以使用下面的方式解决
step1: 在项目根目录下添加.babelrc
文件
{
"env": {
"test": {
"plugins": ["@babel/plugin-transform-modules-commonjs"]
}
}
}
step2:安装ES6语法解析转换插件
npm install --save-dev @babel/plugin-transform-modules-commonjs
此时再运行
npm test
可以看到我们的单元测试,成功通过 可以在 「package.json」 里多加一个配置
"jest": {
"collectCoverage": true
},
会生成一个 coverage 报告
更新
更新之前必须要修改一下版本号,否则就会报错更新失败 因为之前登录过了,所以直接输入npm publish
就可以了
npm publish
再次到npm官网查看自己的库就可以看到,已经更新到1.0.1版本了,并且README文档已经显示出来了
在项目中引入最新包
在终端输入npm install learnjts@latest
npm install learnjts@latest
此时可以看到版本已经更到最新了
这就是我搭建一个自己的JS工具库的全部过程了,其中我遇到的问题和解决方案也都有讲解。但是毕竟经验不足,可能会有一些不对的地方或者局限性,仅供参考
learnjts
工具库既然已经写出来了,其中也写了一些方法。下一步就准备使用vuepress2.x搭建一个文档,方便查阅和使用
learnjts
项目源码和地址在这里☞
github项目地址 |
npm项目地址
如何手写一个js工具库?同时发布到npm上的更多相关文章
- 手写一个虚拟DOM库,彻底让你理解diff算法
所谓虚拟DOM就是用js对象来描述真实DOM,它相对于原生DOM更加轻量,因为真正的DOM对象附带有非常多的属性,另外配合虚拟DOM的diff算法,能以最少的操作来更新DOM,除此之外,也能让Vue和 ...
- 手写一个LRU工具类
LRU概述 LRU算法,即最近最少使用算法.其使用场景非常广泛,像我们日常用的手机的后台应用展示,软件的复制粘贴板等. 本文将基于算法思想手写一个具有LRU算法功能的Java工具类. 结构设计 在插入 ...
- 让我们纯手写一个js继承吧
继承在前端逻辑操作中是比较常见的,今天我们就从零开始写一个js的继承方式 在es5中继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.call(this),在es6中则 ...
- 跟我一起写一个hello-world react组件并发布到npm
第一步:初始化我们的配置 $ mkdir react-hello-world $ cd react-hello-world/ $ npm init -y 修改我们的package.json文件 //p ...
- 如何从0开发一个Vue组件库并发布到npm
1.新建文件夹在终端打开执行 npm init -y 生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等 { "name": "v ...
- 放弃antd table,基于React手写一个虚拟滚动的表格
缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反 ...
- 可在 html5 游戏中使用的 js 工具库
可在 html5 游戏中使用的 js 工具库 作者: 木頭 时间: September 21, 2014 分类: Utilities,Game 使用 cocos2d-js 3.0 开发游戏项目两三个月 ...
- 手写一个React-Redux,玩转React的Context API
上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...
- 手写Express.js源码
上一篇文章我们讲了怎么用Node.js原生API来写一个web服务器,虽然代码比较丑,但是基本功能还是有的.但是一般我们不会直接用原生API来写,而是借助框架来做,比如本文要讲的Express.通过上 ...
随机推荐
- python中的sort用法
内置的列表类型提供sort的方法 可以根据多项指标给list实例中的元素排序.在默认情况下,sort方法总是按照自然升序排列列表内的元素 #升序排列 list1=[2,3,1,2,5] list1.s ...
- 从旧金山到上海, HTTP/3 非常快!
HTTP/3 是超文本传输协议 (HTTP) 的第三个版本,它对 Web 性能来说意义重大, 让我们看看HTTP/3 如何让网站的速度变得更快! 等等,HTTP/2 发生了什么? 不是几年前才开始推广 ...
- Tutorial 3_软件工作量估计和编码规范
软件过程与管理实验 实验3:编码规范 本次实验内容是个人软件过程部分,通过本次实验,学生将掌握以下内容: 1.建立自己的编码规范和代码审查表. 2.会用COCOMO II模型对软件工作量进行估计. [ ...
- uniapp复制到剪贴板
uni.setClipboardData() ; 例: 给元素添加点击事件 <view @click="doCopy()">复制</view> 复制方法 d ...
- AC自动机:Tire树+KMP
简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***.AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个Tire树,然后结合K ...
- 由C# dynamic是否装箱引发的思考
前言 前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会".至于为啥会有很多人有这种疑问,主要是因为觉得dynamic可能是因为有点特 ...
- 性能测试:tcpcopy
简介 TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去. 曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的 ...
- 767. Reorganize String - LeetCode
Question 767. Reorganize String Solution 题目大意: 给一个字符串,将字符按如下规则排序,相邻两个字符一同,如果相同返回空串否则返回排序后的串. 思路: 首先找 ...
- Linux磁盘空间查看及空间满的处理
问题 在部署应用到测试环境的时候,有些文件同步出错,最后定位到测试服务器空间满了. 解决 查看磁盘空间还剩多少空间 df -h 查看根目录下每个目录占用空间大小 du --max-depth=1 -h ...
- Map和WeakMap的方法和区别
Map Map是一组键值对的结构,具有极快的查找速度. 一.构造函数不同 let map = new Map(); let weakmap = new WeakMap(); 二.内置函数不同 Map的 ...