参考: 尚硅谷-node.js
1 命令行基本操作
# 创建文件夹
md hello
# 删除文件夹
rd hello
# 环境变量,不用进入目录即可执行文件
问题,如何找到所有cmd命令的参考文档?
2 线程和进程
如果一个线程负责渲染页面,另一个线程执行js,会有线程安全问题,js是单线程
3 简介
服务器端js环境,js代码直接在系统中运行,脱离浏览器限制
node大部分基本模块都用js编写
google v8引擎 事件驱动 非阻塞/异步io模型
作者ryan dahl,世界大他想去看看,退学,来到智利,开始学编程,学习了ruby on rails,接项目,去客户的地方工作,两年后成为高性能web服务器专家,尝试解决高并发性能问题失败(动机),后有v8引擎,开始写node.js
所有项目瓶颈都是io问题-磁盘速度问题
io阻塞线程执行
node.js是单线程的
node -> 节点 -> 可扩充
领域
web api如rest
实时多人游戏
淘宝在客户端和服务器加node用来渲染页面
4 入门
# 01_hello_node.js
console.log("hello node")
# 终端执行或者右键run
node 01_hello_node.js
commonjs规范
es缺陷: 没有模块化 标准库少 没有标准接口 缺乏管理系统
模块化
在node中一个js文件就是一个模块
# 模块定义 02_module.js
/*
* 模块化
* 1.降低耦合
* 2.方便代码复用
* node中每个js代码都在一个函数中(闭包)
*/
console.log("02 module")
// 暴露
exports.x = "module 2 x"
exports.y = "module 2 y"
exports.fn = function() {
console.log("module 2 fn")
}
=============================
# 模块引用 03_module.js
// 引入其他的模块
// 以相对路径加参数需要加点
var md = require("./02_module")
console.log(md.x)
console.log(md.y)
console.log(md.fn)
练习: 定义math模块
实现加减
# 定义模块 math.js
var math = require("./math")
console.log(math.add(123, 345))
# 引用
var math = require("./math")
console.log(math.add(123, 345))
模块分类
核心模块: node提供的模块
文件模块: 用户自定义的模块
# 核心模块只写名字即可
var fs = require("fs")
console.log(fs)
全局变量相关
// var声明的不是全局变量
// var a = 10
// 不带var声明全局变量
a = 10
// 全局中创建的变量都作为global的属性保存,函数作为方法保存
console.log(global.a)
// 由此可见代码确实运行在函数中(全局无arguments)
// console.log(arguments)
// arguments.callee保存当前执行的函数对象
// node执行代码时会在代码上下方添加函数包起
console.log(arguments.callee + "")
// function (
// exports, // 讲变量或函数暴露到外部
// require, // 用来引入外部的模块
// module, // 当前模块本身
// 可以使用exports导出,也可以使用module.exports导出
// __filename, // 当前模块文件完整路径
// __dirname) // 当前模块目录完整路径
exports
# 模块定义
/*exports.name = "孙悟空"
exports.age = 18
module.exports.sayName = function() {
console.log("我是孙悟空")
}*/
// 一次导出所有
module.exports = {
name: "猪八戒",
age: 28,
sayName: function () {
console.log("我是猪八戒")
}
}
===========================
# 模块引用
var monkeyKing = require("./monkey_king")
console.log(monkeyKing.name)
console.log(monkeyKing.age)
monkeyKing.sayName()