Node.js如何优雅的封装一个实用函数的npm包的方法


Posted in Javascript onApril 29, 2019

为什么要封装一个实用函数的 npm 包?

当你连续写了多个 Node 应用, 都想要 console 漂亮一点, 你可能会像下面这样封装一个函数

import chalk from "chalk";

function noop(msg: string): string {
  return msg
}

function log(fn: Function): (msg: string) => void {
  return (msg: string): void => {
    console.log(fn(msg));
  };
}

export default {
  success: log(chalk.green),
  error: log(chalk.red),
  warn: log(chalk.yellow),
  info: log(chalk.cyan),
  log: log(noop)
};

调用方式

import log from './log'
log.success("hello green message!")
log.error("hello red message!")
log.warn("hello yellow message!")
log.info("hello cyan message!")
log.log("hello normal message!")

慢慢的发现每个项目都需要这么一个 log 文件, 是的! 我们此时可以考虑把这些常用的函数封装集合到一个 npm 包里面了!

需要注意的事项有哪些

单元测试

考虑到代码量的增加以及贡献者的增加事先加入单元测试是很有必要的

  • 测试框架 - Mocha 是一个功能丰富的Javascript测试框架,它能运行在Node.js和浏览器中,支持BDD、TDD、QUnit、Exports式的测试
  • 断言库 - assert 是 Node 自带的

持续集成

Node.js如何优雅的封装一个实用函数的npm包的方法

Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。

Node.js如何优雅的封装一个实用函数的npm包的方法

代码层面

扩展开放, 修改关闭的设计原则

当 src 目录新增一个实用函数文件, index.ts 能够自动抓取然后挂载在 module.export 上

通过 getter 巧妙的实现懒加载导出的功能

Object.defineProperty(module.export, 'log', {
  configurable: false,
  enumerable: true,
  get: () => require('./log')
});

项目地址

https://github.com/xiaoxiaojx/enhanced 欢迎 ? Star ? 和 Pr  和 在项目中使用~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
Oct 23 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
js获取指定时间的前几秒
Apr 05 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
Aug 14 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
vue + axios get下载文件功能
Sep 25 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
js实现右键弹出自定义菜单
Sep 08 Javascript
jQuery实现计算器功能
Oct 19 jQuery
实现elementUI表单的全局验证的方法步骤
Apr 29 #Javascript
深入浅析Vue 中 ref 的使用
Apr 29 #Javascript
详解微信小程序实现跑马灯效果(附完整代码)
Apr 29 #Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
Apr 29 #Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 #Javascript
vue实现微信分享链接添加动态参数的方法
Apr 29 #Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
Apr 29 #Javascript
You might like
PHP SplObjectStorage使用实例
2015/05/12 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
python中os操作文件及文件路径实例汇总
2015/01/15 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python随机函数random()使用方法小结
2018/04/29 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
环保公益策划方案
2014/08/15 职场文书
公司催款律师函
2015/05/27 职场文书
感恩教师节主题班会
2015/08/12 职场文书
升职自荐书
2019/05/09 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js