grunt安装插件并放置到package.json的dependencies中:
npm install grunt-contrib-uglify --save-dev
package.json中dependencies格式:
"~1.2.3" = ">=1.2.3 <1.3.0"
生产环境下 npm install –production 将不安装devDependencies中的包
对于有package.json的node项目,使用npm安装其依赖,-g使得命令行可以调用bin目录中的程序:
# npm install -g
会安装到:
/usr/local/lib/node_modules
npm install -g会安装为命令行工具,但是node环境下依然无法require该类库,会报错:
Error: Cannot find module 'uglify-js'
需要在安装到本目录的node-modules中:
$ npm install uglify-js
查看安装细节,找到问题:
npm install --verbose
对于安装失败的包,手工下载tgz文件,然后:
npm install some.tgz --verbose
控制台彩色字体:
node -e 'process.stdout.write("\033[32m\033[1mhello world\033[0m")'
安装redis:
make
yum install tcl
写密集型操作放到redis中
基于Multi-process and multi-machine scaling考虑,使用redis pub-sub来扩展socket.io,而且这样还可以供其他redis客户端使用。
var socketio = require("socket.io")
var redis = require("redis")
// redis clients
var store = redis.createClient()
var pub = redis.createClient()
var sub = redis.createClient()
// ... application paths go here
var socket = socketio.listen(app)
sub.subscribe("chat")
socket.on("connection", function(client){
client.send("welcome!")
client.on("message", function(text){
store.incr("messageNextId", function(e, id){
store.hmset("messages:" + id, { uid: client.sessionId, text: text }, function(e, r){
pub.publish("chat", "messages:" + id)
})
})
})
client.on("disconnect", function(){
client.broadcast(client.sessionId + " disconnected")
})
sub.on("message", function(pattern, key){
store.hgetall(key, function(e, obj){
client.send(obj.uid + ": " + obj.text)
})
})
})
安装:$ sudo npm install -g express
源码安装:
git clone https://github.com/visionmedia/express.git
git submodule update --init
make install
make install-support
建立project:
$ express /tmp/foo
$ cd /tmp/foo/
安装依赖:
$ npm install -d
(-d 可视化形式显示)
启动:
$ node app.js
curl http://localhost:3000/users/1
var app = require('express').createServer();
app.get('/', function(req, res){
res.send('hello world');
});
app.listen(3000);
logger记录日志,可控制格式
bodyParser根据content-type解析提交的内容,其中数据放在req.body,文件放在req.files
目前支持:
methodOverride在req.method中存放method,用来rest,原来的method放在req.originalMethod中。form中使用_method来提交rest method
cookieParser将cookie放到req.cookies中
session提供了基于memory等的session操作,通过req.session访问
grunt的async提供了promise机制:
// Tell grunt this task is asynchronous.
var done = this.async();
// Write the contents of the target file to the new location
fs.writeFile(pathToWrite, data, function (err) {
if (err) throw err;
console.log(pathToWrite + ' saved!');
// Tell grunt the async task is complete
done();
});
http.get(pathToRead, function(res) {
// Pipe the data from the response stream to a static file.
res.pipe(fs.createWriteStream(pathToWrite));
// Tell grunt the async task is complete
res.on('end', function() {
console.log(pathToWrite + ' saved!');
done();
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
// Tell grunt the async task failed
done(false);
});
Install:
$ npm install -g node-inspector
启动被调试的程序:
$ node --debug-brk your/short/node/script.js
打开调试后端:
$ node-inspector &
在chrome中打开页面 http://127.0.0.1:8080/debug?port=5858 ,可以下断点,各种调试
jinja(Swig): django模板
jshint: 代码静态检查
mocha: js test framework
should: node中使用,扩展了Object
robotskirt: markdown解析