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 相关文章推荐
window.open()弹出居中的窗口
Feb 01 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
Apr 29 Javascript
kmock javascript 单元测试代码
Feb 06 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
js中用window.open()打开多个窗口的name问题
Mar 13 Javascript
javascript每日必学之多态
Feb 23 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
Feb 27 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
vue自动化表单实例分析
May 06 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
Jun 14 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
Apr 10 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
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
JavaScript基本对象
2007/01/11 Javascript
Jquery ui css framework
2010/06/28 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
Vue.use源码学习小结
2018/06/20 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
微信小程序实现留言板
2018/10/31 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Django之form组件自动校验数据实现
2020/01/14 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
话题作文之成长
2019/12/09 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP