7个免费、开源且实用的Node包,你还在等什么?
全文共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 " <[email protected]>', // sender address
to: '[email protected],[email protected]', // 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:<[email protected]> // 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学习与发展的干货
如转载,请后台留言,遵守转载规范