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 相关文章推荐
判断用户是否在线的代码
Mar 05 Javascript
jquery 插件学习(六)
Aug 06 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
Sep 04 Javascript
jQuery过滤选择器详解
Jan 13 Javascript
js同源策略详解
May 21 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
Aug 31 Javascript
详解JS对象封装的常用方式
Dec 30 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
实现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
检测png图片是否完整的php代码
2010/09/06 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
pyhton列表转换为数组的实例
2018/04/04 Python
Python绘图实现显示中文
2019/12/04 Python
python 实现屏幕录制示例
2019/12/23 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
详解python中的闭包
2020/09/07 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
学术会议通知
2015/04/15 职场文书
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle