7个免费、开源且实用的Node包,你还在等什么?

224 阅读5分钟

全文共6992字,预计学习时长20分钟

图源:Unsplash

俗话说的好:天上不会掉馅饼,天下没有免费的午餐。

JavaScript圈似乎打破了这一说法,圈友们各个身怀绝技且乐于分享。


众所周知,JavaScript真正的力量来自于大量可用的开源包。这些免费的开源包促进了JavaScript生态系统的蓬勃发展。我们可以免费使用这些棒呆的包实现自己伟大的编程项目。


今天,小芯将为大家介绍七个超实用的Node包,都是免费的哦!


1. term-size


term-size NPM包能准确确定终端窗口的大小。

term-size 包;来源:Github

当以非交互方式运行时Process.stdout.columns 不存在(例如在子进程中或者管道中)。这个模块甚至在所有电传打印机文件描述符被重定向时也能工作。

安装


$ npm install term-size


用法


const termSize = require('term-size');termSize();

//=> {columns: 143, rows: 24}


Term size 有一个简短的API


termSize() — 返回一个 具有 columns属性和 rows属性的 object(对象)


相关


· term-size-cli — 这个模块的CLI


注意:确认该包可以在macOS, Linux和 Windows上使用。


2. Node MySQL


Node MySQL是node.js 的一个MySQL驱动程序。用JavaScript编写,不需要编译,并且完全由麻省理工学院授权。


Node MySQL.来源: Github

安装


这是一个Node.js模块,可通过 npm 注册表使用 。


安装之前,下载并安装Node.js,需要Node.js 0.6或者更高的版本。


使用npm 安装命令进行安装:


$ npm install mysql


有关以前0.9.x版本的信息,请访问 v0.9 分支。


有时可能要求安装来自Github的最新版本,来检查bugfix是否有效。这种情况下,请执行以下操作:

$ npm install mysqljs/mysql

建立连接


建立数据库连接的推荐方式如下:


var mysql = require('mysql');

var connection = mysql.createConnection({

host : 'example.org',

user : 'bob',

password : 'secret'

});connection.connect(function(err) {

if (err) {

console.error('error connecting: ' +err.stack);

return;

} console.log('connected as id ' + connection.threadId);

});


示例代码


下面是如何使用该包的示例。


var mysql = require('mysql');

var connection = mysql.createConnection({

host : 'localhost',

user : 'me',

password : 'secret',

database : 'my_db'

});connection.connect();connection.query('SELECT 1 + 1 AS solution', function(error, results, fields) {

if (error) throw error;

console.log('The solution is: ',results[0].solution);

});connection.end();

从这个示例中,可以了解:


  • 在连接上调用的每个方法都按顺序排队和执行。
  • 使用 end()关闭连接,确保在quit包发送到服务器之前执行完所有剩余的查询。

3. Commander.js


Commander受Ruby的commander库启发,是node.js命令行界面的完整解决方案。


commander.js. 来源:Github

安装


npm install commander


声明程序变量


Commander输出一个全局对象,有助于程序的快速运行。


const program = require('commander');program.version('0.0.1');


对于可能以多种方式使用commander的更大型程序(包括单元测试),最好创建一个本地命令对象来使用。


const commander = require('commander');

const program = new commander.Command();program.version('0.0.1');


命令


可以使用.command为顶级命令指定(子)命令。有两种实现方法:使用附加在命令上的操作处理程序,或者作为一个独立的可执行文件(稍后将详细描述)。在.command的第一个参数中,指定命令名称和任何命令参数。参数可以是<required>或<optional>,最后一个参数也可能是可变参数……


例如


// Command implemented usingaction handler (description is supplied separately to `.command`)

// Returns new command for configuring.

program

.command('clone <source>[destination]')

.description('clone a repository into anewly created directory')

.action((source, destination) => {

console.log('clone command called');

});// Command implemented usingseparate executable file (description is second parameter to `.command`)

// Returns top-level command for adding more commands.

program

.command('start <service>','start named service')

.command('stop [service]', 'stop namedservice, or all if no name supplied');

4. Chalk


Chalk是用于终端样式的Node包。


Chalk. 来源:Github

Chalk有以下亮点:


· 清晰可读的 API

· 高性能

· 支持嵌套样式

· 支持256/真彩颜色

· 支持自动检测颜色

· 不扩展String.prototype

· 清洁和集中

· 积极维护

· 截至2019年10月1日已被大约46,000个包引用


安装


$ npm install chalk

用法

const chalk = require('chalk');console.log(chalk.blue('Hello world!'));

Chalk附带了一个易于使用的组合API,只需在API中链接和嵌套想要的样式。


const chalk = require('chalk');

const log = console.log;// Combine styled and normal strings

log(chalk.blue('Hello') + ' World' + chalk.red('!'));// Compose multiple stylesusing the chainable API

log(chalk.blue.bgRed.bold('Hello world!'));// Pass in multiple arguments

log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));


5. Nodemailer


Nodemailer是Node.js应用程序的一个模块,可以像发送电子邮件一样简单。该项目开始于2010年,那时还没有发送电子邮件的明智选择,现在它是大多数Node.js用户默认的解决方法。


nodemailer. 来源:Github

Nodemailer是麻省理工学院授权注册的。


准备开始


npm install nodemailer


Nodemailer演示代码


这是一个完整的示例,用以发送一个有纯文本和HTML主体的电子邮件。


const nodemailer =require('nodemailer');// async..await is not allowed in global scope, must usea wrapper

async function main() {

// Generate test SMTP service accountfrom ethereal.email

// Only needed if you don't have areal mail account for testing

let testAccount = await nodemailer.createTestAccount(); // create reusable transporter object usingthe default SMTP transport

let transporter =nodemailer.createTransport({

host: 'smtp.ethereal.email',

port: 587,

secure: false, // true for 465,false for other ports

auth: {

user: testAccount.user, //generated ethereal user

pass: testAccount.pass //generated ethereal password

}

}); // send mail with defined transport object

let info = await transporter.sendMail({

from: '"Fred Foo " <foo@example.com>', // sender address

to: 'bar@example.com,baz@example.com', // list of receivers

subject: 'Hello ✔', // Subject line

text: 'Hello world?', // plaintext body

html: '<b>Helloworld?</b>' // html body

}); console.log('Message sent: %s', info.messageId);

// Message sent:<b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com> // Preview only available when sendingthrough an Ethereal account

console.log('Preview URL: %s',nodemailer.getTestMessageUrl(info));

// Preview URL:https://ethereal.email/message/WaQKMgKddxQDoou...

}main().catch(console.error);


示例


  • Nodemailer AMQP是一个使用RabbitMQ来管理Nodemailer邮件信息的例子。(来源)


Ethereal邮件捕获服务的示例脚本输出如下:


用Nodemailer发送邮件

6. Winston


Winston是一个简单通用的日志库,支持多种传输方式。传输实质上是日志的存储设备。


每个Winston记录器可以对不同级别配置不同的传输方式。例如,用户可能希望将错误日志储存在一个永久的远程位置(如数据库),但是所有日志都会输出到控制台或本地文件。


winston. 来源:Github

Winston旨在将部分日志记录进程解耦,增强其灵活性和扩展性。注意支持日志格式化和级别的灵活性,并确保这些API从运输日志(即如何存储/索引日志)解耦到公开给程序员。


安装


npm i Winston


用法


推荐使用的方式是创建自己的日志记录器。最简单的方法是使用winston.createLogger:


const winston = require('winston');const logger =winston.createLogger({

level: 'info',

format: winston.format.json(),

defaultMeta: { service: 'user-service'},

transports: [

//

// - Write to all logs with level`info` and below to `combined.log`

// - Write all logs error (and below)to `error.log`.

//

new winston.transports.File({filename: 'error.log', level: 'error' }),

new winston.transports.File({filename: 'combined.log' })

]

});//

// If we're not in production then log to the `console` with the format:

// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `

//

if (process.env.NODE_ENV !== 'production') {

logger.add(newwinston.transports.Console({

format: winston.format.simple()

}));

}

用户也可以直接通过require('winston')公开的默认日志记录器进行记录,但这仅仅是一种便于共享的日志记录器,可以在整个应用程序中使用。


7. Passport


Passport是Node.js的登陆验证的中间件,可与Express兼容。


Passport的唯一用途是验证请求,可以通过名为strategies(策略)的可扩展插件集来实现。Passport不挂载路由或承担任何特定的数据库模式,极大地提高了灵活性,并允许开发者做出应用程序级的决策。这个API很简单:提供给Passport一个验证请求,Passport提供hooks来控制验证成功或失败时发生的情况。


passport. 来源:Github

安装


$ npm install passport


用法策略


Passport使用策略(strategies)的概念去验证请求。策略包括:通过使用OAuth委托验证或者使用OpenID进行联合身份验证来验证用户名和密码凭据。


在验证请求之前,必须配置应用程序使用的策略。


passport.use(new LocalStrategy(

function(username, password, done) {

User.findOne({ username: username },function (err, user) {

if (err) { return done(err); }

if (!user) { return done(null,false); }

if (!user.verifyPassword(password)){ return done(null, false); }

return done(null, user);

});

}

));


有480多种策略,可在passportjs.org查找。


会话


Passport包将保持持久的登录对话。为了持续会话,必须将已验证身份的用户序列化到会话,并在发出后续请求时反序列化。


Passport对用户记录的存储方式没有任何限制。相反,用户可以为Passport提供函数,使其实现必要的序列化和反序列化逻辑。在典型应用程序中,这和对用户ID序列化后,再反序列化时通过ID查找用户一样简单。


passport.serializeUser(function(user,done) {

done(null, user.id);

});passport.deserializeUser(function(id, done) {

User.findById(id, function (err, user){

done(err, user);

});

});

图源:Unsplash

结论


希望你能收获到有用的新Node包,用于自己的项目中。如果这里遗漏了你最喜欢的包,可以在下面的回复中与大家分享哦。


最后,不要忘记不时去赞助和支持一下包的创建者和维护者哦。


正所谓“赠人玫瑰手留余香”,每位创建者、维护者和分享者都是天使。

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”


(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)