1.NodeJS的基本简介:
1、通过Node可以让js代码在服务器端中执行;
2、NodeJS其实是对ES标准一个实现,同时Node也是一个JS引擎(安装Node这个程序就有)(Node本身就可以执行JS代码);
3、Node仅仅只对ES标准进行了实现,所以在NodeJS中不包含DOM 和 BOM, 当然也不能操作DOM,BOM;
4、Node中可以使用所有的JS内建对象String Number Boolean Math Date RegExp Function Object Array,另外console,setTimeout() setInterval()也是可以使用的;
5、传统的服务器都是多线程的,但是Node的服务器单线程的;
6、Node可以在后台来编写服务器,并且要注意的Node编写服务器全都是单线程的服务器;
2.模块化
2.1模块化介绍:
简单地说,模块化就是有组织地把一个大文件(大功能) 拆分成多个独立并且又互相依赖的小模块
每个小模块的内部成员紧密结合,外部不能引用(高内聚,且避免了全局污染), 小模块会主动向外部暴露可以使用的接口(低偶合);
在Node中:一个文件就是一个模块(这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展等等)
2.2模块化的好处:
- 避免命名冲突(减少命名空间污染)
- 更好的分离, 按需加载
- 更高复用性
- 高可维护性
2.3模块化的几种处理规范:
1)ES6规范
ES6以后新加模块化规范
2)CommonJS规范
Node.js遵循的模块化规范
3)AMD规范
RequireJS遵循的模块化规范
4)CMD规范
sea.js遵循的模块化规范3、模块化基本使用
```javascript // !addMoule模块(不能在模块的外面使用内部东西,需要暴露才行) function add(n1, n2){ return n1 + n2 } console.log(“addModule模块执行了。。。。”);
// 往exports添加要暴露的内容 // 每一个模块都有一个exports对象,并且会暴露这个对象 exports.add = add; exports.showTime = “表现时刻”;
暴露方式: {
方式一、exports.add = add;
方式二、 // !可以module.exports往外面暴露一个整体 // 这种方式是直接改变module上面的exports对象 // 模块中暴露的其实就是module上的exports对象 // module表示的就是当前模块本身 module.exports = { add, showTime: “表现时刻” } }
// !index模块 index.js // 路径的后缀js可以不写 // 引入模块的时候,模块内部也会执行 // 模块有文件模块(自定义模块) 和 核心模块; //而自定义模块在引入时,路径前面必需要加./或者../ const {add, showTime} = require(‘./addmodule’) console.log(add(10, 20)); console.log(showTime);
<a name="BGkVq"></a># 4、模块详情模块本身其实就是一个函数```javascript// 模块本身其实就是一个函数// arguments.callee表示的就是当前函数本身// console.log(arguments)// console.log(arguments.callee.toString())模块本身其实就是一个函数, 函数体如下:function (exports, require, module, __filename, __dirname){}有五个参数如下:exports:传入的实参为module.exports(PS:这个形参的值其实就是module对象上的exports属性值,exports属性值本向也是一个对象)require:传入的实参为一个函数(PS:可以通过这个require函数引入其它模块)module:传入的实参是module对象(PS:这个对象表示当前模块本身,另外exports只是它身上的一个小属性,你可以打印它看下,会看到一些有意思的东西)__filename:传入的就是当前模块的路径__dirname:传入的就是当前模块的目录路径console.log("当前执行文件的绝对路径:", __filename);console.log("当前执行文件的绝对目录:", __dirname);/*注意:在模块中向外暴露内容时可以使用 module.exports = ...; (比如一个函数,一个对象等)也可以使用 exports.属性名 = 属性值;但是不能 exports = ...; 因为这样并不能向外暴露内容*/
5、核心模块与文件模块
模块分两种:核心模块 、 文件模块(自定义模块):
核心模块 : 是NodeJS本身就有的,Node自带的模块
在引入核心模块时,路径前面不能添加./ 或者 ../require(‘path’)
文件模块 : 就是我们编码自定义的模块
在引入文件模块时,路径前面需要添加./ 或者 ../require(‘./addmodule’)
6、全局对象
global和window差不多 ,都是全局对象(在node.js里面global是全局对象)
// 给全局对象上添加一个数据// 全局对象上的数据,在所有地方都可以访问global.dogName = "小明"
7、包 (小案例NodeJS(day02))
注意:
包文件夹下面需要一个package.json文件,
可以通过npm init 或者 npm init -y来自动生成这个package.json文件
7.1.包的简介:
包是在模块基础上更深一步的抽象;
包是 模块 和 其它资源 组合起来的一个文件夹
可以把一个包看作是 模块 和 其它资源 组合起来形成的 独立作用域
7.2.包的目的或者作用:
是方便分发和推广基于 CommonJS 规范实现的 应用程序 或 类库;
(PS:NodeJS模块化是基于CommonJS 规范的)
7.3.包的特征:
在CommonJS规范中包应该具有以下特征:
- package.json 必须在包的顶层目录下;(这个json文件必需要有,且名字要为package)
- 二进制文件应该在 bin 目录下;
- JavaScript 代码应该在 lib 目录下;
- 文档应该在 doc 目录下;
- 单元测试应该在 test 目录下。
PS:在NodeJS中对包的要求并没有这么严格,只要在包中顶层目录下有 package.json,
并符合一些规范即可;bin,lib,doc,test这四个目录是可选的(但package.json必需要有)
7.4.包与模块的关系:
在NodeJS中,一个文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展等等;
但是一个模块也可以是一个文件夹,你可以把这样的模块认为是一个特殊的模块,也可以叫做它为”包“
在一个包中可以包含其它的模块 或者 其它资源
8.http核心模块
8.1.1.基本使用
// !引入http核心模块const http = require('http')// !创建一个服务端对象const app = http.createServer(function(request, response){console.log("有个小伙子发了请求.....");// 设置响应头,告诉浏览器使用utf8来解释响应内容response.writeHead(200, {"Content-Type": 'text/html; charset=utf-8'})// response 响应对象(通过它给浏览器响应数据)response.write("<h1 style='color: red'>小甜甜</h1>")response.write("<h1 style='color: red'>小可爱</h1>")response.end("<h1>OK</h1>") // 响应并且结束})// !监听启动的端口(注意默认的ip是本地ip,就是localhost)app.listen(3000, function(err){console.log("服务启动成功......");})
8.2.request事件
const http = require('http')const app = http.createServer()// !request事件,接收到请求时,就会触发app.on('request', function(request, response){console.log("request事件触发了。。。");response.end("<h1>OK</h1>");})// !当前客户端连接到服务时,就会触发app.on('connection', function(socket){console.log('connection事件执行了....', socket);})app.listen(3000, function(){console.log("启动成功....");})
8.3.3.获取请求信息
const http = require('http')const app = http.createServer()app.on('request', function(request, response){// response响应对象;给浏览器响应数据,就使用它// request请求对象;存放着浏览器请求发送的数据,//通过它获取请求相关的信息(比如,请求的方式,数据,路径等等)console.log("请求方式:", request.method);console.log("请求路径:", request.url);console.log("请求头:", request.headers);response.end("<h1>OK</h1>");})app.listen(3000, function(){console.log("启动成功....");})
9.、npm简介与使用
npm常用命令:
| npm -v | 查看npm的版本 |
|---|---|
| npm version | 查看所有模块的版本 |
| npm search 包名 | 查找包 |
| npm view 包名 versions | (查看包的所有版本号) |
| npm install / i 包名 | (安装包) |
| npm install 包名 —save | (安装包并添加到依赖中,此依赖不仅开发环境能使用,生产环境也能使用) |
| npm install 包名 —save-dev | (安装包并添加到依赖中,此只在开发环境能使用) |
| npm [remove|uninstall] / r 包名 | (删除包) |
| npm install 包名 -g | (全局安装包,全局安装的包一般都是一些工具相关的包) |
| npm install | (下载项目package.json文件中所有依赖的包) |
| 初始化 | |
| 下载 express |
安装包:
安装包前,对项目进行初始化,生成package.json文件
安装包时,会在当前执行安装命令的路径下,创建一个node_modules文件夹,
下载的第三方包就会存放到这个文件夹下面,
并且在当前项目的package.json文件中生成包的版本信息
