精华 My Toolkit of Node.js 我的Nodejs百宝箱
发布于 10 年前 作者 JerryC8080 14022 次浏览 最后一次编辑是 8 年前 来自 分享

原文见:http://www.jianshu.com/p/f8d7150259a1

Cheerio

Fast, flexible, and lean implementation of core jQuery designed specifically for the server.

Cheerio,说它是服务器端的jQuery一点也不为过,在github上也是大受欢迎,star数达4500有余,至目前为止,已经有923次commit。它兼容jQuery绝大部分的库,以至于你只需要一句$ = require('cheerio').load(YOUR_HTML_CONTENT);,便可以像在前端用jQuery一样的舒畅,愉快。 By the way,和Cheerio类似的框架还有:jsdom,一个受欢迎程度略低于Cheerio,但是它有2,147多的commit,可见维护者之诚意。

Waterline

An adapter-based ORM for Node.js with support for mysql, mongo, postgres, redis, and more

Waterline是从Sails框架衍生出来的Nodejs平台下的ORM,除了支持常见的mysql、mongodb,还支持PostgreSQL、Redis、Memory、Disk等等

Bookshelf

A Node.js ORM for PostgreSQL, MySQL and SQLite3 in the style of Backbone.js

与Waterline类似,但作为同类产品且被Ghost选择标配之一的Bookshelf必然有它的特别之处,仍待君细细品来。

Node-Soap

A SOAP client and server for node.js.

对于REST,大家必然熟悉,就算不熟悉,也是久仰其大名,或者是略有耳闻。REST简单而直观,把HTTP协议利用到了极限,在这种思想指导下,它甚至用HTTP请求的头信息来指明资源的表示形式,用HTTP的错误机制来返回访问资源的错误。但在R.T. Fielding博士在他的论文里提出REST之前,又是谁来承担Web Service这份差使呢? SOAP (Simple Object Access Protocol) 顾名思义,是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据。它基于 XML 格式,在绝大多数情况下,使用HTTP协议传输WSDL请求。 而node-soap模块,则允许在node环境中,接入其他程序语言 (诸如 ASP.net、Java 等) 开发的WebService。也能够在node中开发基于SOAP的WebService供其他程序调用。 当然,在大多数情况下,过去SOAP能做的事,REST也是能做到的,且REST更加优雅,简单。以我的水平,我也是想不清楚SOAP依然存在的必然性,但是有那么一句话:「存在,就是合理的」。既然,它存在,也有人用到,那么在合作开发中和SOAP相遇也是有可能性的,相信那是我们的缘分。 如果你有兴趣,听一下我和SOAP邂逅的故事:SOAP,Web service的枢纽

Passport

Simple, unobtrusive authentication for Node.js.

如果你的站点想快速建立passport-user结构的用户系统,且能够简单的接入流行的第三方登录,用passport就没错了。它不但提供了本站登录的解决方案,还有一大堆第三方登录的策略,见:Strategies 如果你用Sails的话,这里还有一个承接Sails和passport的模块:sails-generate-auth

Bluebird

Bluebird is a full featured promise library with unmatched performance.

Javascript 的世界有一种痛叫「callback hell」,中文翻译过来叫「回调地狱」,如果能承受得了她带来的痛楚,且继续爱着她,这是「真爱」。Promise的概念,能够让你与javascript好好爱的深沉。 实现Promise的库有很多,我知道的有:

  • Q
  • when
  • bluebird
  • jQuery的deferred
  • javascript自带的Promise(一些高级浏览器内置的Promise对象)

其中,我用的比较顺手的当属bluebird,它也是时下最优秀博客系统Ghost的标配之一。 如果你想深入了解Promise的概念,可以点这里:Promises: The Sync Problem 如果你想珍惜时间,珍惜生命,这里有中文版:深入理解Promise五部曲

Lodash

A JavaScript utility library delivering consistency, modularity, performance, & extras.

我想称它为Javascript的瑞士军刀,或者是一个蓝色工具箱。lodash提供了一系列相当不错的跟函数式编程相关的方法。函数式编程就像搭积木一样,像_.identity、.partial、.compose、splat、unsplat等都是职责单一的函数。别看它们简单,把它们当作积木看待,它们释放的是无尽的活力。 越是简单的东西,蕴藏的越是更为无限的可能性。

Node.bcrypt.js

bcrypt for NodeJs

bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。然而,所提供的所有字符都具有十分重要的意义。密码越强大,您的数据就越安全。而node.bcrypt.js则是披上Nodejs斗篷的bcrypt,它的62.2%是C++代码,而Javascript代码只有30.3%。

Moment

Parse, validate, manipulate, and display dates in javascript.

Moment是一个轻量级用于处理日期的工具,除了对日期进行格式化以外,你还能够对日期进行操作,验证,解析。其在github的star数有1.9W+,比众所周知的Express(github star是1.7w+)还多一点。这么优秀的框架实在是相见恨晚。

Skipper

Streaming multi-uploads for Sails/Express - supports disk, S3, gridfs, and custom file adapters

Skipper是一款Sails衍生的处理多文件上传的组件,支持上传文件到本地或者远端服务器,如果默认adapter没有你需要的服务,你还能够自定义一套adapter满足你的需求。就像我为了把文件上传到又拍云而定制了的adapter: skipper-upyun

Node-fs-extra

Node.js: extra methods for the fs object.

Node-fs-extra提供了一些额外的fs没有的函数,如果Nodejs自带的fs模块,还不能满足你在进行文件操作的使用,或者用着不顺心。不妨来node-fs-extra找一下有没有你想要的解决方案。

Mocha

mocha - simple, flexible, fun javascript test framework for node.js & the browser. (BDD, TDD, QUnit styles via interfaces)

Nodejs单元测试哪家强?
mocha,mocha,似魔鬼的步伐~~yo!

Should

BDD style assertions for node.js – test framework agnostic

BDD风格的断言模块,旨在让编程像说白话(至少在测试断言上)。

Supertest

Super-agent driven library for testing node.js HTTP servers using a fluent API

如果测试的时候,需要HTTP请求呢?找Supertest吧,和Should同一个作者,TJ大神,你值得信赖。

PM2

Production process manager for Node.JS applications. Perfectly designed for microservice architecture.

Nodejs单线程的特性,意味着,如果你的某一行代码阻塞了,你的整个程序都会崩溃。人非圣贤,孰能无过,没有人能保证自己的写的代码永无BUG(难道要在文件头加上无BUG神兽?)。在生产环境下,如果程序挂了怎么办?让它自动重启呗。 PM2就是一款解决这种问题的工具,当然,作为一个进程管理器,它的作用不仅仅如此。

Markdown-js

A Markdown parser for javascript

Markdown时下越来越受欢迎了,实质上markdown最终是转换成HTML格式才能显示于网页的。而markdown-js则是把markdown格式的文本转化成HTML格式的工具。但是,如果从HTML格式的文本转化成Markdown格式的文本呢?markdown-js好像不支持,那就用to-markdown吧。

后话

本文的描述及用语,仅基于本人目前的水平而写,难免有所局限和措辞不当之处。如果有BUG或者不当之处,欢迎指出与吐槽。


如果本文对您有用 请不要吝啬你们的Follow与Start 这会大大支持我们继续创作

「Github」 MZMonster :@MZMonster JC_Huang :@JerryC8080

「简书」 MZMonster:@MZMonster JC_Huang:@JC_Huang

41 回复

赞一下 我补充两个 faker,产生用来测试的模拟数据 dotenv,管理配置设置

@russj 哈哈,多谢分享啊!

最近使用了下bookshelf,处理多对多关系的问题折腾了一周都没搞定,最后只好改用sequelize半个小时就好了

@hpgt sequelize还真没接触过,不过看介绍,单独promise-based,就很吸引我了。居然还支持SQL Server!!

都是好人家,嫁了吧

好东西,mark 自豪地采用 CNodeJS ionic

好东西 学习了

报告老大,我想推荐「Async」由 caolan 前辈所撰的 Library

markdown-js建议换成markdown-it,速度和功能都应该会有提升

@grass0916 async党可尝试neo-async,api level兼容async,但执行效率要高不少

这个是干货,果断收藏了

###好东西,先收藏###

用Q好像比较爽吧? 自豪地采用 CNodeJS ionic

楼主多次提到了 sails 衍生出来的工具, sails 一定也不错咯? 最近想学习下 sails, 可是官方文档门槛偏高, 基本就是 api, 楼主对 sails 熟悉吗, 有啥好点的入门资源? @JerryC8080

markdown用marked比较好

楼主有关Sails stack的我都有用。从去年6月开始的0.9版开始用Sails,到目前觉得能给7/10的评价。Waterline的adapter很优秀,可是query能力很有限,很多时候还是要调用所用数据库的native方法,最常见的比如MongoDB里的基于位置的查询。 羊年了还用PM2/Forever?是时候上Nginx + Phusion Passenger了,超级容易上手和配置,你值得拥有。我一晚上就照着官方Doc在DigitalOcean的VM上搭好并配置好了nginx.conf。https://www.phusionpassenger.com/

有兴趣的话我可以把目前调教/优化好的nginx.conf贴上来。

补充几个, sequelize, 除了ORM以外,还提供了client工具, 叫做sequelize-cli , migration用起来就像rails一样。 nconf 管理配置文件的 newrelic 监控 grunt/gulp那一堆 自动化的各种,你懂的。 cors 跨域 bower 管理前端用的js库 shipit 自动化部署(我觉得有点挫,但目前没找到更好的,可能node最佳的部署方案还是docker)

@onlyurei 请分享一下你的 nginx 配置,不是很清楚 passenger 怎么样用在 sails.js 服务上。谢谢

不少都用过,还是mark

记号一下,明天看看 自豪地采用 CNodeJS ionic

@zieglar

user www-data; ##1 worker per CPU core worker_processes 1; pid /run/nginx.pid;

events { worker_connections 1024; multi_accept on; use epoll; }

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
charset utf-8;  
charset_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript;
client_max_body_size 10m;   
client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_body_timeout 20;
client_header_timeout 20;
keepalive_timeout 20;
send_timeout 20;

more_set_headers 'Server';
more_set_headers 'X-Powered-By';
server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# Logging Settings
##

access_log off;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_static on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
# gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##

# include /etc/nginx/naxsi_core.rules;

##
# Phusion Passenger Configs
##
# Uncomment it if you installed passenger or passenger-enterprise
##

passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/ruby;

# Does not make sense to set this to more than the number of CPU cores.
passenger_max_pool_size 1;

# Do not shutdown the app.
passenger_pool_idle_time 0;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

##
# Open File Cache Configs
##
open_file_cache max=10000 inactive=5m;
open_file_cache_valid 2m;
open_file_cache_min_uses 1;

server_names_hash_bucket_size 64;

server {
    listen 80;
    server_name rentever.com;

    # The static assets are in another foler instead of `public`, so tell Nginx about it.
        root /var/www/dev.rentever.com/.tmp/public;

        # Static assets cache policy.
    location ~* \.(?:ico|eot|svg|ttf|woff|css|html|js|gif|jpe?g|png)$ {
        expires 3d;
                add_header Pragma public;
                add_header Cache-Control "public";
        }

        passenger_app_root /var/www/dev.rentever.com;
        passenger_enabled on;
        passenger_app_type node;

    # Prevent the pre-started application processes to be shut down after a few minutes of inactivity. 
    passenger_min_instances 1;

        # Folder where `restart.txt` is located. By touching that file, Passenger will restart this server.
        passenger_restart_dir /var/www/dev.rentever.com;
}

server {
    listen 80;
        server_name www.rentever.com;
        return 301 http://rentever.com$request_uri;
}

# Passenger will normally only start the server when the 1st request comes in, which will be slow for that unfortunate user. 
# Set pre start to start the server before 1st request comes in.
passenger_pre_start http://rentever.com:80/;

}

谢谢分享 自豪地采用 CNodeJS ionic

可以补充不楼主?

都是好东西

MARK,收藏研究

回到顶部