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 相关文章推荐
javaScript 利用闭包模拟对象的私有属性
Dec 29 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
Mar 17 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 Javascript
如何在Linux上安装Node.js
Apr 01 Javascript
Yarn的安装与使用详细介绍
Oct 25 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
jQuery+koa2实现简单的Ajax请求的示例
Mar 06 jQuery
解析Json字符串的三种方法日常常用
May 02 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
vue引入axios同源跨域问题
Sep 27 Javascript
浅谈JS和jQuery的区别
Mar 27 jQuery
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 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 foreach、while性能比较
2009/10/15 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
跟老齐学Python之集合(set)
2014/09/24 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
python处理document文档保留原样式
2019/09/23 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
收款委托书范本
2014/09/11 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
教师求职简历自我评价
2015/03/10 职场文书
《我的长生果》教学反思
2016/02/20 职场文书