1. no http server.
PHP->User : PHP interpretor - > HTTP interpretor(Apache, IIS, Nginx) -> browser - > user
Node JS -> User : Node JS -> browser - > user
2. Asynchronous I/O
Synchronous I/O - multithread to improve performance
Aynchronous I/O - no need to concern about it, because node just forward I/O request to system, and continue to process.
3. exports.SomeFunction = SomeFunction vs module.exports = SomeFunction
require('someFilePath') vs require ('someFunction')
4. npm -> node; pip -> python; gem -> ruby; pear -> PHP; CPAN -> perl; apt-get -> debian/ubuntu; yum -> fedora/rhel/cent os; homebrew -> mac os x
5. npm install someModule -> local install module to subdir(node_modules) of current dir. we can require the module directly. but it is not set for global use, and bin is not in PATH.
npm install -g someModule -> global install mobule to /usr/local/lib/node_modules, and bin is linked to /usr/local/bin, here, /usr/local/bin exist in PATH by default. but we can`t require this modules directly. we need npm link
6. npm link someModule in project folder(not support by windows)
./node_modules/someModules - > /usr/local/lib/node_modules/someModule, link the global modules as local use.
npm link can also link local module as global use, we should run npm link in package folder(which include package.json)
7. server side, node --debug-brk debug.js (default port is 5858, we can change this by --debug=xxxx)
client side, node debug 192.168.59.32:5858
n,c,s,o,sb(),list(5), bt, watch(expr)
8. global variable and global object.
in JS, 'window' is the global object.
in Node JS, 'global' is the global object.
global object is the holder of global variables.
Global Variables:
a. the most outside variables
b. variable in 'global' (for example 'process')
c. implicit defined variables(assign value without define)(we can use 'var' to avoid global)
9. process
process.argv
process.stdin.resume(), and set a callback to get user input.
process.stdin.on('data', function(data){...})
process.netxTick(cb)
process.platform
process.pid
process.execPath
process.memoryUsage
10. util.inherits(sub, base)
ctor override?
Base.prototype.somefunction = function will be inherited. other in the body won`t. and even the prototype can`t be displayed as console.log(subobj), but we can invoke it.
11. util.inspect(obj), util.inspect(obj, true), util.isArray(), util.isDate(), util.isError(), util.format(), util.debug().
********************************************************
12. event drive. events.
events.EventEmitter
emitter.on('eventStringAsType', function(arg1, arg2){...})
emitter.emit(''eventStringAsType', arg1, arg2')
emitter.once(event, listener), register 1 time cb
emitter.remove(event, listener)
emitter.removeAllListeners([event])
emitter.emit('error'), trigger bt
13. for vs forEach, (function(i){xxx(i)...};)(i)
14. scope
brace (for, if , etc...) is not a scope identifier.
variables are searched from inside to outside of a function. And it is a 'static scope', not a 'runtime scope'
15. closure, return a embedded function and its env(variables), used in embedded cb, or private variable
16. prototype
declare class belongings(like static in c++) as a prototype, or all the variables and functions in ctor will be copied when create a new instance.
17. call (pass variable separately), apply(pass variables in array), bind (change 'this' permanently)