30个有用的npm包

TNTWeb - 全称腾讯新闻中台前端团队,组内小伙伴在Web前端、NodeJS开发、UI设计、移动APP等大前端领域都有所实践和积累。

目前团队主要支持腾讯新闻各业务的前端开发,业务开发之余也积累沉淀了一些前端基础设施,赋能业务提效和产品创新。

团队倡导开源共建,拥有各种技术大牛,团队Github地址:https://github.com/tnfe

本文作者云峰 github: https://github.com/ihtml5

image

很早之前,软件工程师就通过减少程序中重复代码来显著加速开发过程。Nodejs生态通过npm包的形式复用代码,目前累计有超过100多万个开源可用的包。其中一些流行的包每周下载量破千万,是许多应用程序的基础,从小型宠物项目到知名科技初创公司都有使用到。

今天,现代Web应用程序中97%的代码来自npm模块。我们遴选了30个常用的nodejs安装包,让您免于重新发明轮子。

一、实用功能

1. qs

一个简单易用的字符串解析和格式化库

const qs = require('qs');
constv assert = require('assert');

const obj = qs.parse('a=c');
assert.deepEqual(obj, { a: 'c' });

const str = qs.stringify(obj);
assert.equal(str, 'a=c');

2.rxjs

RxJS是一组模块化的库,用于使用 JavaScript 中的可观察集合和组合来组合异步和基于事件的程序。

const { range } = require('rxjs');
const { map, filter } = require('rxjs/operators');
range(1, 200).pipe(
  filter(x => x % 2 === 1),
  map(x => x + x)
).subscribe(x => console.log(x));

3. mitt

微型 200b 功能事件发射器/发布订阅.

import mitt from 'mitt'
const emitter = mitt()
emitter.on('foo', e => console.log('foo', e) )
emitter.on('*', (type, e) => console.log(type, e) )
emitter.emit('foo', { a: 'b' })
emitter.all.clear()

function onFoo() {}
emitter.on('foo', onFoo)   // listen
emitter.off('foo', onFoo)  // unlisten

4.Underscore.js

Underscore.js是一个用于 JavaScript 的实用程序带库,它在不扩展任何核心 JavaScript 对象的情况下为通常的功能嫌疑人(each、map、reduce、filter 等)提供支持。

const _ = require(“underscore);
const list = [[5, 1, 7], [3, 2, 1]];
_.invoke(list, 'sort');
// => [[1, 5, 7], [1, 2, 3]]

5.day.js

Day.js是一个极简主义的 JavaScript 库,它为现代浏览器解析、验证、操作和显示日期和时间,并具有很大程度上与 Moment 兼容的 API。

const dayjs = require(“dayjs”);
dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');

6.Ramda

Ramda是一个实用的函数式库,具有可与柯里化组合的无副作用函数。

import * as R from 'ramda';
const double = x => x * 2;
R.map(double, [1, 2, 3]); 
// => [2, 4, 6]
R.map(double, {x: 1, y: 2, z: 3}); 
// => {x: 2, y: 4, z: 6}

7.validator

Validator是一个字符串验证器和清理器库。

var validator = require('validator');
validator.isEmail('foo@bar.com'); //=> true

8.yup

yup是一个用于复杂的、相互依赖的验证和转换的模式构建器。

import * as yup from 'yup';
let schema = yup.object().shape({
  name: yup.string().required(),
  age: yup.number().required().positive().integer(),
  email: yup.string().email(),
  website: yup.string().url(),
  createdOn: yup.date().default(function () {
    return new Date();
  }),
});
// check validity
schema
  .isValid({
    name: 'jimmy',
    age: 24,
  })
  .then(valid => 
    console.log(valid) // => true
  );
// you can try and type cast objects to the defined schema
schema.cast({
  name: 'jimmy',
  age: '24',
  createdOn: '2014-09-23T19:25:25Z',
});
// => { name: 'jimmy', age: 24, createdOn: Date }

9.Lodash

Lodash是一个实用程序库,通过消除处理数组、数字、对象、字符串等的麻烦,使 JavaScript 变得更容易。

const _ = require("lodash");
const nums = _.range(1, 9);
// => [1, 2, 3, 4, 5, 6, 7, 8, 9]
const chunks = _.chunk(nums, 3);
// => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
const right = _.takeRight(nums, 2);
// => [7, 8, 9]

10.date-fns

Date-fns提供了最全面、最简单且一致的工具集,用于在浏览器和 Node.js 中操作 JavaScript 日期。

import { format, formatDistance, formatRelative, subDays } from 'date-fns'
format(new Date(), '[Today is a] dddd')
//=> "Today is a Wednesday"
formatDistance(subDays(new Date(), 3), new Date())
//=> "3 days ago"
formatRelative(subDays(new Date(), 3), new Date())
//=> "last Friday at 7:26 p.m."

11.jsonwebtoken

Jsonwebtoken是一个用于对 JSON Web 令牌进行签名、验证和解码的库。

const jwt = require('jsonwebtoken');
const token = jwt.sign({ foo: 'bar' }, 'shhhhh');

12.uuid

UUID 是一个用于创建 RFC4122 通用唯一标识符的库。

const { v4: uuidv4 } = require('uuid');
uuidv4(); // => '1a68a438-b077-468b-b1e8-dcdd976a0f5b'

Working With File System

1.rimraf

Rimraf 为节点提供了与 UNIX rm -rf 命令等效的命令。

const rimraf = require(“rimraf”);
rimraf('./build', error => {
  if (error) console.error(error);
});

2.fs-extra

FS-extra 添加了未包含在本机 fs 模块中的文件系统方法,并为 fs 方法添加了 promise 支持。

const fs = require(‘fs-extra’);
async function copyFiles () {
  try {
    await fs.copy('/tmp/myfile', '/tmp/mynewfile');
    console.log('success!');
  } catch (err) {
    console.error(err);
  }
}
copyFiles();

3.mkdirp

就像 mkdir -p 一样,mkdirp 递归地创建目录和所有必要的子目录。

const mkdirp = require('mkdirp')
// return value is a Promise resolving to the first directory created
mkdirp('/tmp/foo/bar/baz').then(made =>
  console.log(`made directories, starting with ${made}`));

4.glob

Glob 是一个使用多种模式匹配文件的库。

const glob = require("glob");
// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
});

5.shelljs

ShellJS 是基于 Node.js API 的 Unix shell 命令的可移植 (Windows/Linux/OS X) 实现。

const shell = require('shelljs');
if (!shell.which('git')) {
  shell.echo('Sorry, this script requires git');
  shell.exit(1);
}
// Copy files to release dir
shell.rm('-rf', 'out/Release');
shell.cp('-R', 'stuff/', 'out/Release');
// Replace macros in each .js file
shell.cd('lib');
shell.ls('*.js').forEach(function (file) {
  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);
  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);
});
shell.cd('..');
// Run external tool synchronously
if (shell.exec('git commit -am "Auto-commit"').code !== 0) {
  shell.echo('Error: Git commit failed');
  shell.exit(1);
}

6.js-yaml

Js-yaml 是 YAML 的一种实现,YAML 是一种流行的人性化数据序列化语言。

const yaml = require('js-yaml');
const fs   = require('fs');
// Get document, or throw exception on error
try {
  const doc = yaml.load(fs.readFileSync('/home/ixti/example.yml', 'utf8'));
  console.log(doc);
} catch (e) {
  console.log(e);
}

二、Web框架

1. koa

Koa 是由 Express 背后的团队设计的新 Web 框架,旨在成为 Web 应用程序和 API 的更小、更具表现力和更健壮的基础。

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});
app.listen(3000);

2. express

Express is 是最流行、最快速、最简约的 node.js 后端 Web 框架。

const express = require('express');
const app = express();
app.get('/', function (req, res) {
  res.send('Hello World');
});
app.listen(3000);

3. Fastify

Fastify是最快的可扩展 Web 框架之一,专注于以最少的开销提供最佳的开发人员体验。

const fastify = require('fastify')({
  logger: true
});
fastify.get('/', async (request, reply) => {
  reply.type('application/json').code(200);
  return { hello: 'world' };
});
fastify.listen(3000, (err, address) => {
  if (err) throw err;
  fastify.log.info(`App listening on ${address}`);
});

4. socket.io

Socket.IO使用长轮询或 WebSockets 启用实时双向基于事件的通信,并具有断开连接检测和自动重新连接支持。

const server = require('http').createServer();
const io = require('socket.io')(server);
io.on('connection', client => {
  client.on('event', data => { /* … */ });
  client.on('disconnect', () => { /* … */ });
});
server.listen(3000);

image

三、改进开发过程

1. jest

Jest 已完成并准备好设置 JavaScript 测试解决方案

test('adds 1 + 2 to equal 3', () => {
  expect(1 + 2).toBe(3);
});

2. typescript

TypeScript 是可扩展的 JavaScript。 它是一种添加可选类型并编译为普通可读 JavaScript 的语言。

interface User {
  name: string;
  id: number;
}
const user: User = {
  name: "Hayes",
  id: 0,
};

3.winston

Winston 是一个简单且通用的日志库,支持多种传输。

const winston = require('winston');
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    // Write all logs with level `error` and below to `error.log`
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    // Write all logs with level `info` and below to `combined.log`
    new winston.transports.File({ filename: 'combined.log' }),
  ],
});
logger.log({
  level: 'error',
  message: 'Hello distributed log files!'
});
logger.info('Hello again distributed logs');

4.debug

Debug 是一个微型 JavaScript 调试实用程序,模仿 Node.js 核心的调试技术。

const debug = require('debug')('http')
  , http = require('http')
  , name = 'My App';
debug('booting %o', name);
http.createServer(function(req, res){
  debug(req.method + ' ' + req.url);
  res.end('hello\n');
}).listen(3000, function(){
  debug('listening');
});

5. eslint

ESLint 是一种用于查找和修复 JavaScript 和 TypeScript 代码中问题的工具。

{
    "rules": {
        "semi": ["error", "always"],
        "quotes": ["error", "double"]
    }
}

6. nodemon

Nodemon 是一个工具,它通过在检测到目录中的文件更改时自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序。

nodemon ./server.js 

7. dotenv

Dotenv 是一个零依赖模块,可将 .env 文件中的环境变量加载到 process.env 中

.env file:

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
require('dotenv').config();
const db = require('db');
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
});

8. cross-env

Cross-env enables scripts to set and use environment variables across platforms.

{
  "scripts": {
    "start-prod": "cross-env NODE_ENV=production node ./app.js"
  }
}

image

原文地址:https://cloud.tencent.com/developer/article/1869698

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340