30个有用的npm包

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一个简单易用的字符串解析和格式化库

代码语言:txt复制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.rxjsRxJS是一组模块化的库,用于使用 JavaScript 中的可观察集合和组合来组合异步和基于事件的程序。

代码语言:txt复制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 功能事件发射器/发布订阅.

代码语言:txt复制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) // unlisten4.Underscore.jsUnderscore.js是一个用于 JavaScript 的实用程序带库,它在不扩展任何核心 JavaScript 对象的情况下为通常的功能嫌疑人(each、map、reduce、filter 等)提供支持。

代码语言:txt复制const _ = require(“underscore);

const list = [[5, 1, 7], [3, 2, 1]];

_.invoke(list, 'sort');

// => [[1, 5, 7], [1, 2, 3]]5.day.jsDay.js是一个极简主义的 JavaScript 库,它为现代浏览器解析、验证、操作和显示日期和时间,并具有很大程度上与 Moment 兼容的 API。

代码语言:txt复制const dayjs = require(“dayjs”);

dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');6.RamdaRamda是一个实用的函数式库,具有可与柯里化组合的无副作用函数。

代码语言:txt复制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.validatorValidator是一个字符串验证器和清理器库。

代码语言:txt复制var validator = require('validator');

validator.isEmail('foo@bar.com'); //=> true8.yupyup是一个用于复杂的、相互依赖的验证和转换的模式构建器。

代码语言:txt复制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.LodashLodash是一个实用程序库,通过消除处理数组、数字、对象、字符串等的麻烦,使 JavaScript 变得更容易。

代码语言:txt复制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-fnsDate-fns提供了最全面、最简单且一致的工具集,用于在浏览器和 Node.js 中操作 JavaScript 日期。

代码语言:txt复制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.jsonwebtokenJsonwebtoken是一个用于对 JSON Web 令牌进行签名、验证和解码的库。

代码语言:txt复制const jwt = require('jsonwebtoken');

const token = jwt.sign({ foo: 'bar' }, 'shhhhh');12.uuidUUID 是一个用于创建 RFC4122 通用唯一标识符的库。

代码语言:txt复制const { v4: uuidv4 } = require('uuid');

uuidv4(); // => '1a68a438-b077-468b-b1e8-dcdd976a0f5b'Working With File System1.rimrafRimraf 为节点提供了与 UNIX rm -rf 命令等效的命令。

代码语言:txt复制const rimraf = require(“rimraf”);

rimraf('./build', error => {

if (error) console.error(error);

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

代码语言:txt复制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 递归地创建目录和所有必要的子目录。

代码语言:txt复制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.globGlob 是一个使用多种模式匹配文件的库。

代码语言:txt复制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.shelljsShellJS 是基于 Node.js API 的 Unix shell 命令的可移植 (Windows/Linux/OS X) 实现。

代码语言:txt复制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-yamlJs-yaml 是 YAML 的一种实现,YAML 是一种流行的人性化数据序列化语言。

代码语言:txt复制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. koaKoa 是由 Express 背后的团队设计的新 Web 框架,旨在成为 Web 应用程序和 API 的更小、更具表现力和更健壮的基础。

代码语言:txt复制const Koa = require('koa');

const app = new Koa();

app.use(async ctx => {

ctx.body = 'Hello World';

});

app.listen(3000);2. expressExpress is 是最流行、最快速、最简约的 node.js 后端 Web 框架。

代码语言:txt复制const express = require('express');

const app = express();

app.get('/', function (req, res) {

res.send('Hello World');

});

app.listen(3000);3. FastifyFastify是最快的可扩展 Web 框架之一,专注于以最少的开销提供最佳的开发人员体验。

代码语言:txt复制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.ioSocket.IO使用长轮询或 WebSockets 启用实时双向基于事件的通信,并具有断开连接检测和自动重新连接支持。

代码语言:txt复制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. jestJest 已完成并准备好设置 JavaScript 测试解决方案

代码语言:txt复制test('adds 1 + 2 to equal 3', () => {

expect(1 + 2).toBe(3);

});2. typescriptTypeScript 是可扩展的 JavaScript。 它是一种添加可选类型并编译为普通可读 JavaScript 的语言。

代码语言:txt复制interface User {

name: string;

id: number;

}

const user: User = {

name: "Hayes",

id: 0,

};3.winstonWinston 是一个简单且通用的日志库,支持多种传输。

代码语言:txt复制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.debugDebug 是一个微型 JavaScript 调试实用程序,模仿 Node.js 核心的调试技术。

代码语言:txt复制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. eslintESLint 是一种用于查找和修复 JavaScript 和 TypeScript 代码中问题的工具。

代码语言:txt复制{

"rules": {

"semi": ["error", "always"],

"quotes": ["error", "double"]

}

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

代码语言:txt复制nodemon ./server.js 7. dotenvDotenv 是一个零依赖模块,可将 .env 文件中的环境变量加载到 process.env 中

代码语言:txt复制.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-envCross-env enables scripts to set and use environment variables across platforms.

代码语言:txt复制{

"scripts": {

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

}

}image

相关推荐

如何制作并上传淘宝店招?
365国际速发彩票

如何制作并上传淘宝店招?

🪐 08-19 👁️ 1153
全幅入门新战力 佳能EOS 6D Mark II评测
365国际速发彩票

全幅入门新战力 佳能EOS 6D Mark II评测

🪐 08-02 👁️ 4856
掌握Windows电脑,轻松管理iPad平板:四大技巧让你玩转跨平台控制!