http 模块

http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。

创建基本 Web 服务器

const http = require('http')
// 创建 web 服务器实例
const server = http.createServer()
// 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  const url = req.url
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)
  // 设置 Content-Type 响应头,解决中文乱码的问题
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // 向客户端响应内容
  res.end(str)})server.listen(8080, function () {
  console.log('server running at <http://127.0.0.1:8080>')})

实现简陋路由效果

const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
  const url = req.url
  // 设置默认的响应内容为 404 Not found
  let content = '<h1>404 Not found!</h1>'
  // 判断用户请求的是否为 / 或 /index.html 首页
  // 判断用户请求的是否为 /about.html 关于页面
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于页面</h1>'
  }
// 设置响应头防止中文乱码
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  res.end(content)})server.listen(80, () => {
// 使用res.end把内容响应给客户端
  console.log('server running at <http://127.0.0.1>')})

模块化

模块化概念

Node.js 中模块的分类

// 加载内置模块
const fs = require('fs')
// 加载用户的自定义模块
const custom = require('./custom.js')
// 加载第三方模块
const moment = require('moment')

Node.js 中的模块作用域

模块作用域的成员

(1)module 对象 每个 .js 自定义模块中都有一个 module 对象,导入模块时,其实是导入module.exports指向的对象。默认值为 {}

(2)module.exports 在 module.exports 对象上挂载属性方法

// test.js
[module.exports.name](<http://module.exports.name/>) = 'zs'
	module.exports.sayHello = function(){
	console.log('Hello World ')
}

// 指向了新对象会覆盖上面的挂载参数
module.exports = {
	nikname = 'ls',
	sayHi() {
		console.log('say hi')
	}
}
// index.js
const custom = require('./test')
console.log(custom)				// {name:zs,sayHello:[Function]}

(3)exports 简化 module.exports。默认情况下 exports 和 module.exports 指向同一个对象。最终结果以 module.exports 指向的对象为准

// test.js
[exports.name](<http://exports.name/>) = 'zs'
	exports.sayHello = function(){
	console.log('Hello World ')
}
// index.js
const custom = require('./test')
console.log(custom)				// {name:zs,sayHello:[Function]}

(4)同时使用注意事项 使用 require() 模块时,得到的永远是 module.exports 指向的对象. 建议只用一种方式,以防混淆

Untitled

CommonJS 模块化规范

模块加载机制

模块第一次加载后会被缓存,即多次调用 require() 不会导致模块的代码被执行多次,提高模块加载效率。

内置模块加载

内置模块加载优先级最高。

自定义模块加载

加载自定义模块时,路径要以 ./../ 开头,否则会作为内置模块或第三方模块加载。

导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:

第三方模块加载

例如,假设在 C:\\Users\\bruce\\project\\foo.js 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:

初次装包完成后,在项目文件夹下多一个叫做 node modules 的文件夹和 package-lock.json 的配置文件。不要手动修改里面的东西,npm包管理工具会自动维护。

node modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。

package-lock.json 配置文件用来记录 node modules 目录下的晦一个包的下载信息,例如包的名字、版本号、下载地址等。

7.dependencies 作用:在 package.json 中记录核心依赖包信息

正常安装默认为核心依赖包

8.devDependencies 作用:在 package.json 中记录开发依赖包信息

如果某些包只在项目开发阶段用到,在项目上线以后不会用到,建议把这些包记录在 devDependencies 中。相反,如果在开发及上线都用到,则记录在 dependencies 中。一般来说依据官方使用说明安装即可

# 安装到 devDependencies 
npm i 包名称 -D
npm install 包名称 --save-dev

包的分类

那些被安装到项目中的 node_modules 目录中的包都是项目包,项目包又分为两类:

npm i 包名 -D # 开发依赖包
npm i 包名    # 核心依赖包

全局包:在执行npm install 命令时提供了 -g 参数,则会把包安装位区全局包。

npm i 包名 -g   # 全局安装指定的包
npm uninstall 包名 -g    # 卸载全局包

共享代码

由于第三方包(node_modules)体积过大,不方便分享代码,所以共享时应剔除 node_modules

项目根目录下创建 package.json ,记录安装了哪些包。使用 git 时应把 node_modules 添加到 .gitignore 中。

# 编写代码前先创建 package.json 项目目录不能有中文和空格
# 安装包时,会自动记录包信息到 package.json
npm init -y

# 一次性安装所有的包	
npm install
npm i

目录作为模块加载

当把目录作为模块标识符进行加载的时候,有三种加载方式: