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 相关文章推荐
ie9 提示'console' 未定义问题的解决方法
Mar 20 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
May 17 Javascript
基于JS实现省市联动效果代码分享
Jun 06 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
Aug 03 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
canvas 绘制圆形时钟
Feb 22 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 Javascript
vue中如何自定义右键菜单详解
Dec 08 Vue.js
实现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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
解析php中反射的应用
2013/06/18 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
一个超级简单的python web程序
2014/09/11 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
高考考python编程是真的吗
2020/07/20 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
香港礼品网站:GiftU eshop
2017/09/01 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
电子商务专业学生职业生涯规划
2014/03/07 职场文书
违纪检讨书范文
2015/01/27 职场文书
2016教师节问候语
2015/11/10 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
导游词之阆中古城
2019/12/23 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js