按顺序来

如果你会就忽略

  1. html css javascript: https://developer.mozilla.org/zh-CN/docs/Web
  2. 稍微了解下sass和coffeescript:
    1. https://developer.mozilla.org/zh-CN/docs/Web
    2. https://en.wikipedia.org/wiki/Sass_(stylesheet_language)
  3. node.js 官方13篇文档(不是按照顺序来的, 建议先看getting started): https://nodejs.org/en/docs/guides/
  4. 真正的node入门(大面都是对的): https://www.nodebeginner.org/index-zh-cn.html
  5. 两点忠告:
    1. 别学框架, chrome only是最完美的解决方案.
    2. 忘记面向对象, 函数化是更简明的方案.
  6. 再多一点资源, 貌似很不错的资源:
    1. npm安装的本地学习资源: https://nodeschool.io
    2. 据说讲师是妹子: http://www.ifrog.cc/course/44#1

其实吧

语言啥的真心都不算难学, 但是, 关键的点一般的语言介绍都不好好讲, 然后, 我们无法掌握这个语言的思维方式, 就导致这个语言学起来巨难. 推荐两本书, 我觉得堪称典范:

  1. the c language (c语言)unix的两个作者写的那本. 这本书好到什么地步? 甚至于它能造成一个假象, 我们也能写出大牛的代码, 比如bill joy的内存调度……
  2. scip 中文版是裘宗燕翻译的, 这个讲的是scheme, 看看人家讲的, 深入浅出啊, 连个java都讲不清楚的作者们, 脸红不? 人家老先生讲的可是lisp啊啊啊啊啊…….
  3. 补一本, 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直接安装在了当前目录, 这个有问题了. 明天查一下.

  1. 重启机器试一下.
  2. node的机制就是装在本地, 奶奶的
  3. 参加后文: [总结: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

  1. 用链式调用替换原本的括号套写法.
  2. 需要一个进度调度, 否则任何一个大量异步的nodejs都会死. 这个是个单独的专题了.