nodejs和 JavaScript
- JavaScript 在浏览器中和node平台中有什么区别?
- JavaScript在浏览器中(宿主环境),渲染页面,动态效果,发送请求..
- 在node平台中 javascript具备着后台语言的能力,宿主服务器,接收请求,文件读写,操作数据库存储大量数据
- 面试题: node平台架构和浏览器架构的区别的了解?
- node不需要渲染,没有了DOM和BOM,没有了document/window对象
try{
var obj = document; //1
console.log('浏览器环境');//1出现异常这一行不执行了,直接进入到catch块
}catch(e){//当前异常的对象,形参,名称可以改,底层系统会为我们把异常对象传入进来
console.log('是node环境');//e.stack 报错的信息和行数
}
- node:构建于JavaScript chrome V8 之上的运行时(环境),事件驱动、非阻塞IO,
- 平台:包含着JavaScript运行时环境,包含着后台语言CommonJS规范的实现,包含和服务器
全局对象
- 在任何模块中,可以直接使用
- global 他就可以类比成我们所学的window
- global.num3 = 1 为了其他模块可以使用 相当于我们以前
- function(){ window.num3 = 1;} 供其他文件使用
- process / console / Buffer / require / exports / module / 杠杠dirname /杠杠filename
真伪全局对象本质
- 伪 : require / exports / module / 杠杠dirname /杠杠filename
- 真伪全局对象的本质是什么:每个模块有自己模块不同的伪全局对象的值,真全局对象所有模块共享一个值
环境变量配置
- 方式1: 直接在系统变量path中添加对应可执行程序或者批文件(.bat)程序的路径
- 方式2: 自定定义一个系统变量,在path中直接引入,引入方式是%变量名%
process对象
- process.pid 当前进程ID
- process.env 获取当前系统的环境变量,process.env[环境变量名称] 获取对应的值,判断系统
- process.argv 获取命令行参数,前两个参数是对应命令或者文件的绝对路径
- 开发命令行工具
node xxx.js 1 + 2
// [ 'D:\\node_dev\\nodejs\\443\\node.exe',
// 'C:\\Users\\tujunxiong\\Desktop\\node_03\\code\\01_process_prop.js',1,+,2 ]
- 案例演示:
- process.abort() // 强退,不释放资源的退出,不建议使用,
- process.exit() // 释放资源以后再退出
- process.kill(pid) //根据进程ID 结束进程
- process.nextTick(callback) //异步立刻执行下一个任务
- js 中,代码是同步优先的
std相关流(了解)
模块系统
nodejs中模块总体组成
- commonjs中一个模块就是一个文件
- 核心模块(node工作人员开发的核心模块)
- 第三方模块(开发正开发的自定义模块)
- 自定义模块 (我们自己开发的模块,比如我们cal.js)
- 需求-> 分析-> 实现-> 通过考虑核心模块能不能换实现,自定义模块实现,自定义模块实现不了,通过第三方模块来实现
- quick_start http|child_process|fs|都是核心模块,只能用
核心模块
Node.js 默认提供了一些核心模块,实际上也是文件模块,
但是核心模块在源代码进行编译的时候已经被编译到了二进制的可执行文件中了(加快运行速度) node.exe,启动程序时,node会优先从二进制文件中获取核心对象
* 案例演示:复制文件
需求: 通过控制台参数,复制文件到指定目录
参数1:源文件,参数2:目标文件
* 核心模块直接引入,不用给路径
module模块
- module.parent
- module.children
- 不管针对谁,调用require的,此时就是parent,而require的参数就是children
- module.paths 包的加载路径
- module.exports 向外导出对象
require 加载规则(文件)
- 相对路径 ./ ../ 都可以匹配,针对当前运行程序的目录
- 绝对路径 C:/aaa/bbb/ 了解就好
- 提供支持变量传入参数的形式,可以便于我们批量的加载模块
require 加载规则(文件夹)
- 当我们引入’./cal’ 出现两种可能性:
- 1: 找当前目录下的cal.js/cal.json/cal.node(二进制程序)
- 2: 当前cal文件夹下的index.js
- 在文件夹下index.js是固定的,只有index.js才能被认为是文件夹加载的方式
包 与 npm
npm
npm 开源库生态系统
- nodejs官网上:npm是世界上最大的开源库生态管理系统 对应的第三方包都存储在网站的服务器中 开源库网站:https://www.npmjs.com/ 资源描述
- npm 命令行工具 提供下载 第三方资源包的下载
npm 命令行模块管理工具
- 包的初始化:
- 安装 npm install(i) 包名 [–save] 添加到依赖项中,默认安装的是比较新且稳定的版本
- 根据–save 会在package.json文件中dependencies项添加记录
- npm install 恢复所有的依赖
- 卸载
- npm uninstall 包名 [–save] 卸载,只有给了–save才删除package.json文件中的依赖项,否则只删除包文件
- 文档
配置全局命令行工具存储路径
- 查看全局命令行工具存储路径 npm root -g
- npm config set prefix “D:/tjx2”
- npm root -g 会默认给你加上node_nodules,用来区分启动程序和包文件的路径
- 启动程序在D:/tjx2里面的browser-sync.cmd 实际的代码在 D:/tjx2/node_modules目录下
配置新修改的全局命令行工具存储路径的环境变量
- 用户变量中的path变量配置一个路径,这个路径就是你配置的pm config set prefix “D:/tjx2”中的D:/tjx2,因为这个路径下有启动文件
- 注意:配置完毕重启命令行,一共是3部
browser-sync介绍
- 中文网 http://www.browsersync.cn/
- 保存文件自动刷新,释放你的F5
- 使用: 1: 安装 npm install -g browser-sync
- 2:(新开一个命令行) 走到指定文件的目录下,shift + 鼠标右键,在此处打开命令行窗口
- 3:browser-sync start –server –files “当前命令行的相对路径:index.html,index2.html” 也可以用* 代替任意字符
moment.js介绍
- 中文官方网站: http://momentjs.cn/
全局命令
包
规范的包目录结构
- package.json 包说明文件
- Bin 存二进制文件
- Doc 文档
- Test 测试用例
- lib 存放js代码
package.json
- scripts:启动对应的命令 如果里面的对象key是start: 就通过npm start来启动
- 可以执行多个命令,中间用&& 来分隔
"scripts": {
"start": "npm install && ping 127.0.0.1 && notepad && node ./a.js"
},
"main":"app.js"
- 加载机制:require(‘./cal’);
- 1: cal文件夹下有没有package.json文件,并且要有main属性
- 2: 找当前目录下的cal.js/cal.json/cal.node(二进制程序)
- 3: 当前cal文件夹下的index.js
require 加载规则(包)
- 逐级向上查找,有没有node_modules/包名
- 如果没有,最终找到盘符根目录下的node_modules
- 查找机制就是module.paths 的值