运行环境
1. V8引擎负责解析和执行JavaScript 代码
2. 内置API是由运行环境提供的特殊接口,只能在所属的运行环境中被调用
3. nodeJs 是基于Chrome V8 引擎的javaScript运行环境
4. 浏览器是JavaScript 的前端运行环境 ,nodeJS是JavaScript 的后端开发环境,nodeJs中无法调用 DOM和BOM等浏览器内置API
nodeJs可以做什么
1. 基于Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用
2. 基于 Electron 框架 (https://electronjs.org/),可以构建跨平台的桌面应用
3. 基于restify 框架(http://restify.com/),可以快速构建API
4. 接口项目读写和操作数据库、创建实用的命令行工具辅助前端开发、etc...
什么是客户端、什么是服务器?
1. 负责消费资源的电脑,叫做客户端;
2. 负责对外提供网络资源的电脑,叫做服务器;
域名和域名服务器
IP地址和域名是一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS)的电脑中、使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供 IP 地址和域名之间的转换服务的服务器
HTTP模块
req 请求对象:只要服务器接收到了客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数
res 响应对象:在服务器的 request 事件处理函数中,调用 res.send() 响应客户端
模块化
什么是模块化: 把一个大文件拆成独立并互相依赖的多个小模块
模块化规范:
1. 每个模块内部,module 变量代表当前模块
2. module 变量是一个对象,它的 exports 属性(即 module.exports) 是对外的接口加载某个模块,其实是加载该模块的 module.exports 属性。require0 方法用于加载模块
模块化的好处:
1. 提高了代码的复用性
2. 提高了代码的可维护性
3. 可以实现按需加载
模块类型: 内置模块(由官网提供),自定义模块(自己创建的模块),第三方模块(第三方开发模块)
模块作用域好处:防止全局变量污染
module对象:每个js自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息
require() 模块时,得到的永远是 module.exports 指向的对象
npm切换数据源
nrm 切换数据源
项目包
开发依赖包: (记录到 devDependencies 节点中的包,只在开发期间会用到) npm i -D
核心依赖包: (记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到) npm i
全局包: npm i -g
卸载: npm uninstall 包名 -g
包规范:
1. 包必须以单独的目录而存在
2. 包的顶级目录下要必须包含 package,json 这个包管理配置文件
3. package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口。
发布NPM包
1. 新建 tools 文件夹,作为包的根目录
2. 在 tools 文件夹中,新建 package.json (包管理配置文件) , index.js (包的入口文件) ,README.md(包的说明文档)
3. 开发包功能
4. 创建npm官网账号
5. 在终端登录账号 先切换到npm的官方, 然后执行登录命令 : npm login
6. 通过 npm pubilsh (包名不能重名)
6. 删除包 npm publish 包名 --force (可以删除74小时之内的包, 24小时内不能重复提交)
模块的加载机制
自定义模块加载机制:
1. 模块在第一次加载后会被缓存。 这也意味着多次调用 require()不会导致模块的代码被执行多次注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率
2. 在使用 require0 导入自定义模块时,如果省略了文件的扩展名,则 Nodejs 会顺序分别尝试加载以下的文件:
1. 按照确切的文件名进行加载
2. 补全 .js 扩展名进行加载
3. 补全 json 扩展名进行加载
4. 补全.node 扩展名进行加载
5. 都加载不到会报错
第三方模块的加载机制:
如果传递给 require() 的模块标识符不是一个内置模块,也没有以/或/开头则 Nde.js 会从当前模块的父目录开始,尝试从 node-modules 文件夹中加载第三方模块。如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。