学习nodejs
按顺序来
如果你会就忽略
- html css javascript: https://developer.mozilla.org/zh-CN/docs/Web
- 稍微了解下sass和coffeescript:
- https://developer.mozilla.org/zh-CN/docs/Web
- https://en.wikipedia.org/wiki/Sass_(stylesheet_language)
- node.js 官方13篇文档(不是按照顺序来的, 建议先看getting started): https://nodejs.org/en/docs/guides/
- 真正的node入门(大面都是对的): https://www.nodebeginner.org/index-zh-cn.html
- 两点忠告:
- 别学框架, chrome only是最完美的解决方案.
- 忘记面向对象, 函数化是更简明的方案.
- 再多一点资源, 貌似很不错的资源:
- npm安装的本地学习资源: https://nodeschool.io
- 据说讲师是妹子: http://www.ifrog.cc/course/44#1
其实吧
语言啥的真心都不算难学, 但是, 关键的点一般的语言介绍都不好好讲, 然后, 我们无法掌握这个语言的思维方式, 就导致这个语言学起来巨难. 推荐两本书, 我觉得堪称典范:
- the c language (c语言)unix的两个作者写的那本. 这本书好到什么地步? 甚至于它能造成一个假象, 我们也能写出大牛的代码, 比如bill joy的内存调度……
- scip 中文版是裘宗燕翻译的, 这个讲的是scheme, 看看人家讲的, 深入浅出啊, 连个java都讲不清楚的作者们, 脸红不? 人家老先生讲的可是lisp啊啊啊啊啊…….
- 补一本, c++的设计与演化, c++的创造者写的.
- 真心的,
- 好看,
- 像小说一样好看.
再夸夸node
PayPal为什么从Java迁移到Node.js,性能提高一倍,文件代码减少44%
大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal** 解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2个人用更少的时间干了5个人的活), 性能提高一倍, 代码量减少33%, 文件减少40%:
知识点: twitter的bootstrap
后方高能预警
安装
brew install node
#node和npm都装好了, 可以-v看版本.
有问题参考: https://www.dyclassroom.com/howto-mac/how-to-install-nodejs-and-npm-on-mac-using-homebrew
参考
- https://nodejs.org/en/ 建议大家就看这个英文, 太好看了.
- https://www.npmjs.com/
随手调试: repl
node
#然后就已经进入了node环境, 可以输入js看看结果.
#这个方式等同于来chrome/safari里面的javascript console
入门
这个文件要保存一个文件名比如mmm.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
运行
node mmm #你刚刚保存的mmm.js
127.0.0.1:3000 #在浏览器输入这个就可以访问页面了.
语法
let { stat, exists, readFile } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
问题
nodemodule直接安装在了当前目录, 这个有问题了. 明天查一下.
- 重启机器试一下.
- node的机制就是装在本地, 奶奶的
- 参加后文: [总结:npm]
总结: 读写文件
- node cat.js file.txt #第二个文件作为输入
// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
console.log('Usage: node ' + process.argv[1] + ' FILENAME');
process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
, filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
if (err) throw err;
console.log('OK: ' + filename);
console.log(data)
});
- 读取一个大文件, 无法全部读取到内存处理, 比如一个1G的文件.
// 没有结尾需要\n的问题, 也没有bufferedreader is Deprecated的问题
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream('file.in')
});
lineReader.on('line', function (line) {
console.log('Line from file:', line);
});
- 读文件的时候读到了一个buffer, 想读string的.
fs.readFile("test.txt", "utf8", function(err, data) {...});
//指定编码就解决了会当做二进制读取的问题.
- 写文件
var fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
追加写文件:
fs.appendFile("./log/testresult"+today+".log",xxx+"=="+(no++)+"\n" , function(err) {
console.log("The file was saved!", Date.now());
});
- 三个方法
fs.write(fd, buffer, offset, length, position, callback)
//You need to wait for the callback to ensure that the buffer is written to disk. It's not buffered.
fs.writeFile(filename, data, [encoding], callback)
//All data must be stored at the same time; you cannot perform sequential writes.
fs.createWriteStream(path, [options])
//Creates a WriteStream, which is convenient because you don't need to wait for a callback. But again, it's not buffered.
总结: json
//简单的parse
var config = JSON.parse(str);
//或者用require也行.
var config = require('./config.json');
//这样的话, 只读一次, 后续的读取都从缓存弄, 如果文件不会改变, 就没问题.
//文件必须.json结尾.
//同步的, 非异步, 包括读文件都是同步的.
{//如果config.json是这样的.
"firstName": "Joe",
"lastName": "Smith"
}
console.log(config.firstName + ' ' + config.lastName);
todo
- 用链式调用替换原本的括号套写法.
- 需要一个进度调度, 否则任何一个大量异步的nodejs都会死. 这个是个单独的专题了.