初见 nodejs
安装
nodejs
node-v5.7.0-x64.msi
nvm
为了方便切换nodejs的多个版本,可以采用多版本管理器。
Node Version Manager(Node版本管理工具)
环境变量的配置
NVM_HOME = 当前 nvm.exe 所在目录
NVM_SYMLINK = node 快捷方式所在的目录
PATH += %NVM_HOME%;%NVM_SYMLINK%;
NVM_HOME
C:\nvm\
NVM_SYMLINK
C:\Program Files\nodejs
PATH
%NVM_HOME%;%NVM_SYMLINK%;
python
一些概念
CommonJS
为了统一 JavaScript 在浏览器之外的实现,CommonJS 诞生了。CommonJS 试图定义一套普通应用程序使用的API,从而填补 JavaScript 标准库过于简单的不足。CommonJS 的终极目标是制定一个像 C++ 标准库一样的规范,使得基于 CommonJS API 的应用程序可以在不同的环境下运行,就像用 C++ 编写的应用程序可以使用不同的编译器和运行时函数库一样。
第一个js程序
REPL模式
REPL (Read-eval-print loop),即输入—求值—输出循环。Node.js 也有这样的功能,运行无参数的 node 将会启动一个 JavaScript的交互式 shell
$ node
> console.log('Hello World');
Hello World
undefined
> consol.log('Hello World');
ReferenceError: consol is not defined
at repl:1:1
at REPLServer.eval (repl.js:80:21)
at repl.js:190:20
at REPLServer.eval (repl.js:87:5)
at Interface.<anonymous> (repl.js:182:12)
at Interface.emit (events.js:67:17)
at Interface._onLine (readline.js:162:10)
at Interface._line (readline.js:426:8)
at Interface._ttyWrite (readline.js:603:14)
at ReadStream.<anonymous> (readline.js:82:12)
进入 REPL 模式以后,会出现一个“>”提示符提示你输入命令,输入后按回车,Node.js将会解析并执行命令。如果你执行了一个函数,那么 REPL 还会在下面显示这个函数的返回值,上面例子中的 undefined 就是 console.log 的返回值。如果你输入了一个错误的指令,REPL 则会立即显示错误并输出调用栈。在任何时候,连续按两次 Ctrl + C 即退出 Node.js 的 REPL 模式。
简单 HTTP 服务器
// 定义服务器
var http = require('http');
http.createServer(function(req,res) {
// HTTP 协议响应头
res.writeHead(200, {'Content-Type': 'text/html'});
// 服务器返回的数据
res.write('<h1>nodejs</h1>');
// 数据发送结束
res.end();
// 监听3000接口
}).listen(3000);
console.log("Http server is listen 3000");
执行如下代码:
node app.js
打开浏览器,访问 http://localhost:3000/,即可看到服务器返回的页面。
文件监听工具
// 安装
npm install -g supervisor
// 执行文件
supervisor app.js
事件与事件式编程
采用事件通知的方式来处理 I/O,服务器 等
模块
模块是 nodejs 中的基本组成成分,一个文件就是一个模块。在node中,模块可能是 JS代码,JSON 或者 编译过的 C/C++ 扩展。
定义模块 module.js
// 模块的成员变量
var name = '';
// 模块的成员方法
exports.setName = function(myName) {
// 可以使用名字
name = myName;
}
// 模块的成员方法
exports.sayHello = function() {
console.log('Hello ' + name);
}
使用模块:
var myModule = require("./module.js");
myModule.setName("Jack");
myModule.sayHello();
【注意】 require 不会重复加载模块。获取的模块都是同一个。
包管理器
npm [install/i] [package_name]
例如:
npm install express
会将包安装到当前目录下的 node_modules 目录下
// 全局安装,将模块安装到系统目录下
npm install -g express
调试
命令行调试
// 进入调试模式
node debug app.js
// 常用命令
run 执行脚本,在第一行暂停
restart 重新执行脚本
cont, c 继续执行,直到遇到下一个断点
next, n 单步执行
step, s 单步执行并进入函数
out, o 从函数中步出
setBreakpoint(), sb() 在当前行设置断点
setBreakpoint(‘f()’), sb(...) 在函数f的第一行设置断点
setBreakpoint(‘script.js’, 20), sb(...) 在 script.js 的第20行设置断点
clearBreakpoint, cb(...) 清除所有断点
backtrace, bt 显示当前的调用栈
list(5) 显示当前执行到的前后5行代码
watch(expr) 把表达式 expr 加入监视列表
unwatch(expr) 把表达式 expr 从监视列表移除
watchers 显示监视列表中所有的表达式和值
repl 在当前上下文打开即时求值环境
kill 终止当前执行的脚本
scripts 显示当前已加载的所有脚本
version 显示 V8 的版本
远程调试
如下的命令没有测试成功,因为这在实际开发中也用不太到,所以过滤掉。
node --debug[=port] script.js
node --debug-brk[=port] script.js
node app.js
node --debug-brk app.js
node --debug 127.0.0.1:5858
资源
http://nodejs.org/api/
标准的nodejs接口文档
https://www.byvoid.com/en/project
《NodeJS开发指南》源代码
http://cnodejs.org/
中国nodejs开发者论坛
学习手册
EcmaScript6 名字简称 ES2015 ES6
使用babel把ES6编译成ES5大部分浏览器可以执行的代码
各大浏览器对es6支持的情况
http://kangax.github.io/compat-table/es6/
npm install --save-dev babel-cli
使用babel-cli的方式也可以把es6编译
使用方式
<code>babel src/index.js --out-file dist/index.js 也可以使用以下简写方式 babel src/index.js -o dist/index.js </code>
搭建es6环境
webpack
babel
watch
webpack-dev-server
如果你的控制台说无法找到该命令,尝试运行 node_modules/.bin/webpack-dev-server。正常情况下你应该把该命令加在 package.json 中,例如:"scripts": {"start": "webpack-dev-server"}。
利用webpack开发服务器
watch 实时监听并重新加载
把这些东西直接复制到你的package.json里面
然后执行 npm i
<code>"devDependencies": { "babel": "^6.23.0", "babel-core": "^6.3.26", "babel-loader": "^6.2.0", "babel-preset-env": "^1.5.2", "babel-preset-es2015": "6.24.1", "babel-preset-stage-3": "^6.22.0", "webpack": "^2.3.2", "webpack-dev-server": "^2.5.0" } </code>
下面是webpack配置文件
<code>const webpack = require('webpack'); const path = require('path'); module.exports = { context: __dirname, entry: './src/index.js', watch: true, output: { path: path.resolve(__dirname, './dist'), filename: 'bundle.js', publicPath: '/dist/' }, module: { loaders: [ { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" } ] } }</code>