一、命令行窗口常用命令
dir
:列出当前目录下所有文件及文件夹cd dName
:进入指定目录,cd ..
为返回上级目录md
或者mkdir
:创建文件夹rd
或者rmdir
:删除文件夹rd
或者rmdir
:删除文件夹cls
: 清屏exit
: 退出命令行
二、进程和线程
1. 进程
概念
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程为程序的运行提供了必备的环境。
我们写的代码和程序都是放在进程里面的,相当于工厂中的车间
2. 线程
概念
线程是计算机中的最小计算单位,负责执行进程中的程序
相当于车间中的操作工人
单线程
- js是单线程
- 时间片分割
多线程
根据任务决定开启几条线程(占用内存)
Node服务器
- 单线程,但很健壮,后台拥有一个I/O线程池进行调度
- 分布式服务器部署
三、安装Node.js
可在控制台使用node -v
查看node版本
四、 Node开发需要模块化
- 在Node中,一个js文件就是一个模块
- 在Node中,通过
require()
函数来引入外部的模块 - 在Node中,每一个js文件中的js代码都是独立运行在一个小闭包中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问(目的:全局变量私有化,避免全局污染)
- 暴露模块中的变量和函数通过
exports
,只需要将需要暴露给外部的变量或方法设置为exports
的属性即可
// a.js
let str = 'This is a string from another module'
let fn = () => {
console.log('This is a function from another module')
}
exports.str = str
exports.fn = fn
// b.js
const a = require('./a.js')
console.log(a.str)
a.fn()
exports
和require
怎么来的
- window不是Node中的全局对象
- Node中有一个全局对象global,作用和window类似
- exports 和 require 并不是全局变量
exports
和require
其实是函数的参数,之前说过在Node中,每一个js文件中的代码都运行在一个独立的闭包中,所以我们可以通过console.log(arguments.callee.toString())
来看下闭包的代码
function (exports, require, module, __filename, __dirname) { // const file2 = require('./2')
// console.log('Hello World!')
// let a = 10, b = 20
// console.log(a * b)
// console.log(file2.str2)
// file2.fn2()
// console.log(global)
console.log(arguments.callee.toString())
}
Node文件组成剖析
- 当Node在执行模块中的代码时,它会将js文件中的代码用如下代码包裹起来
function(exports, require, module, _filename, _dirname) {
//***
}
- 所以模块中的代码都是包装在一个函数中执行的,并且在函数执行的同时传递进了5个实参
exports
: 该对象用来将函数内部的局部变量或局部函数暴露到外部require
: 用来引入外部的模块-
module
: 代表的是当前模块本身,exports
就是module
的属性;我们既可以使用exports
导出,也可以使用module.exports
导出
Node为每个模块提供一个exports变量,指向module.exports。
不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系 __filename
: 当前模块的完整路径__dirname
: 当前模块所在文件夹的完整路径
exports
和module.exports
的区别
exports
变量指向module.exports
,所以exports
只能通过exports.xxx
来向外暴露内部变量,如果直接将exports
变量指向一个值,等于切断了exports
与module.exports
的联系module.exports
可以通过module.exports.xxx
,也可以直接赋值一个对象,module.exports = {xxx:yyy}
来向外暴露内部变量
包和包管理器
包
概念
CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具,这组工具就叫做包。
组成
最重要的是包描述文件package.json
描述包的相关信息,以供外部读取分析,它是一个JSON格式的文件,位于包的根目录下
package.json文件中,不能加入任何注释
包管理器(NPM)
对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
详见 Npm入门
如果在页面中因素node_modules中的某个模块,优先从当前目录引入,如果当前目录找不到,则往上级查找,直到根目录
故如果很多小项目依赖相同,可提取node_modules文件夹至父级目录以节省存储空间
五、 REPL(交互式解释器)
Node自带的REPL(Read Eval Print Loop 交互式解释器)表示一个电脑的环境,我们可以在终端中输入命令,并接收系统的响应。
交互式解释器可以执行以下任务
- 读取 读取用户输入,解析输入了Javascript数据结构并存储在内存中。
- 执行 执行输入的数据结构
- 打印 输出结果
- 循环 循环操作以上步骤指导用户两次按下
Ctrl + c
按钮退出
// 输入 node 来启动REPL交互式解释器
node
下划线_
变量
在REPL中可以使用下划线_
来获取上一个表达式的运算结果
常用命令
Ctrl + c
按下两次: 退出Node REPLCtrl + d
: 退出Node REPL.help
: 列出可使用命令.break
: 退出多行表达式.clear
: 退出多行表达式.save filename
: 保存当前的Node REPL会话到指定文件.load filename
: 载入当前的Node REPL会话的文件内容