第一章 Node.js绪论
第一讲.命令行窗口
命令行窗口也叫 小黑屏 cmd窗口 终端 shell
win+r,cmd,回车
常用指令:
dir 列出当前目录下的所有文件
cd+目录名 进入文件夹
md+目录名 创建一个文件夹
rd+目录名 删除一个文件夹
直接输入文件名+回车 打开文件
e: 进入e盘
’ + '表示一个空格
目录:
. 表示当前目录
… 表示上一级目录
cd .. 回到上一级目录
1
环境变量(window系统中的变量)
分为用户变量和系统变量
path变量:存放的是在cmd命令行中可以直接打开的文件
当我们在命令行窗口打开一个文件或调用一个程序时,系统会先在当前目录下寻找文件程序,如果找到了,就直接打开,如果没找到,则会依次到环境变量的path中寻找,直到找到为止
如果没找到,则报错
所以我们可以将一些经常访问的程序和文件添加到path中,这样我们就可以在任意位置访问这些文件和程序.
修改之后要重启命令行才能生效
第二讲.进程和线程
进程:
进程负责为程序的运行提供必备的环境
进程就相当于工厂中的车间
线程:
是计算机中最小的计算单位,负责执行进程中的程序
线程相当于工厂中的工人
单线程是一个人干活,多线程是多个人干活
js是单线程
第三讲.Node历史
Node.js是一个能够在服务器端运行JS的开源代码,跨平台的JS运行环境
Node采用谷歌的V8引擎运行js代码,使用事件驱动,非阻塞和异步IO等技术提高性能,可优化应用程序的传输量和规模
Node.js创建起初的目的是创建高性能的web服务器
传统服务器是多线程的,每进来一个请求,就创建一个线程去处理请求
Node处理请求时是单线程的,但是在后台拥有一个IO线程池
第二章 Node.js基础
第一讲.操作JS
node书写js代码步骤:
安装node.js
打开cmd命令行
输入node,进入node状态,即可编写js代码
但是这样体验不是很好,我们更希望直接在.js文件中书写,然后用node执行
步骤:
打开cmd命令行
打开js所在文件夹
输入node+js文件名,即可执行
直接在目录中输入cmd,可以直接进入该目录所在的cmd
第二讲.模块化简介
JS的缺陷:
没有模块系统
标准库较少
没有标准接口
缺乏管理系统
模块化可以将一个完整的程序分成一个一个小的程序
降低耦合性,便于代码复用
如果程序设计的规模达到了一定程度
模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制
CommonJS的模块功能可以帮我们解决这个问题,则必须对其进行模块化
CommonJS对模块的定义十分简单:
模块定义
模块引用
模块标识
模块化:
在node中,一个js文件就是一个模块
在node中,每一个js文件中的js代码,都是独立运行在一个函数中,而非全局作用域
因此,一个模块中的变量和函数在其他模块中无法访问
通过require( )函数来引入外部的模块
可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块
这里的路径如果使用相对路径,必须使用.或…开头
使用require引入模块,该函数会return一个对象,该对象代表的是引入的模块
var md=require('./02.module.js');
由于每个js文件都是封闭的,因此如果想向外部暴露变量和方法,可以将需要暴露给外部的变量和方法,设置为exports的属性:
exports.x=10;
exports.fn=function(){
console.log('a');
}
就不用var了
在引用时,这么写:
var a=require('./module01');
console.log(a.fn());
第三讲.模块化详解
模块标识:
require中的文件路径,称为模块标识
我们使用require引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
模块分为两类:
核心模块
由node引擎提供的模块,核心模块的标识就是模块的名字
var fs=require('fs');
文件模块
用户自己创建的模块,模块标识就是文件路径,可以说绝对或者相对路径
相对路径使用.或…开头
在全局对象有一个global,他的作用和网页中的window类似
在全局中创建的变量都会作为global的属性保存
在全局中创建的函数都会作为global的方法保存
可以通过global判断一个变量是不是全局变量
实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递了五个实参
当node在执行模块中的代码时,它会首先在代码的最顶部添加如下代码:
function(exports,require,module,_filename,_dirname){
在代码的最底部,添加如下代码:
}//就是一个大括号
所以,我们可以使用exports和require
exports 用来将变量或函数暴露到外部
require 函数,用来引入外部的模块
module 代表的是当前模块自身
exports就是module的属性,所以既可以使用exports导出,也可以使用module.exports导出
_filename 当前模块的完整路径
_dirname 当前模块所在文件夹的完整路径
第四讲.exports和module.exports
我们不论使用exports还是module.exports,最后改变的都是module的exports属性
但是如果这样赋值:
exports={
a:10;
b:20;
}
module.exports={
a:10;
b:20;
}
第一个不能用,第二个可以用,因为exports是引用数据类型,它实质上是一个指针,如果直接修改exports,相当于将它指向了一个其他的对象.而修改module.exports,则是直接修改值本身
第五讲.包
CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具
包规范:
包结构
用于组织包的各种文件
包描述文件
描述包的相关信息,以供外部读取分析
包实际上就是一个压缩文件,解压以后还原为目录.
符合规范的目录,除了主js文件以外,应该包含如下文件:
package.json 描述文件,相当于包的说明书,必须有
bin 可执行二进制文件
lib js代码
doc 文档
test 单元测试
后面四个都是可有可无的
package.json,实质上就是一个json文件,用于描述非代码的相关信息
它是一个JSON格式的文件,其中的字段主要有:
dependencies 依赖
这个包使用时依赖于哪些包
devDependencies 开发依赖
开发时需要依赖什么,但是使用时并不需要
main 主文件目录
maintainers 开发者
version 版本
keywords 关键字
bugs 提交bugs的地址
等
在JSON中,不能写注释!!!
第六讲.npm
NPM: Node Package Manager Node包管理系统
类似于360安全卫士里的软件管家
对于Node而言,NPM帮助其完成了第三方模块的发布,安装和依赖(会自动下载所有依赖的文件).借助NPM,Node与第三方模块之间形成了很好的生态系统
Node中最重要的功能就是NPM
NPM的使用:(要先在命令行中输入npm)
npm±v 查看版本
npm 帮助说明
npm+search+包名 在网上搜索期望的包
npm+install+包名 在当前目录安装包
如果后面加一个–save 在安装包的同时加入到依赖中
npm+install+包名±g 全局模式安装包,一般都是些工具,适用于计算机,而非项目.
npm+init 在当前目录下创建.json文件(一路回车)
npm+remove+包名 删除包
npm+install 下载当前项目依赖的包,这是每一个包使用之前的必须指令!!!
第七讲.配置cnpm
npm是外网的,有时候不稳定
于是中国有一个镜像,将美国的东西都下载下来了
输入:
npm install -g cnpm -registry=https://registry.npm.taobao.org
1
然后以后使用的就是cnpm,而非npm去下载包
cnpm的文件格式与npm略有不同,目的是不会覆盖npm的官方版本
第八讲.搜索包的流程
通过npm下载的包,都放到了node_modules文件夹中
我们通过npm下载的包,直接通过包名引入即可
node在使用模块的名字引入模块时,会首先在当前目录的node_modules中寻找是否有该模块
如果有就直接用,如果没有则去上一个目录的node_modules中寻找
一直找到磁盘的根目录,如果一直没有则报错。