文章目录

  • 一、初识 Node.js
    • (一)JS 解析引擎
    • (二)JS 运行环境
    • (三)Node.js
      • 1、作用
      • 2、命令
  • 二、fs 文件系统模块
    • (一)fs 模块
    • (二)方法
      • 1、fs.readFile()
      • 2、fs.writeFile()
      • 3、路径动态拼接
  • 三、path 路径模块
    • (一)path 模块
    • (二)方法
      • 1、path.join()
      • 2、path.basename()
      • 3、path.basename()
  • 四、http 模块
    • (一)http 模块
    • (二)web 服务
    • (三)服务器相关概念
    • (四)创建 web 服务器
      • 1、创建基本 web 服务器
        • (1)req
        • (2)res
      • 2、根据不同 url 响应不同 html
      • 3、实现 web 服务器
        • (1)核心思路
        • (2)实现步骤
  • 五、Node 模块化
    • (一)模块化基本概念
    • (二)Node.js 模块分类
      • 1、三类模块
      • 2、加载模块
      • 3、模块作用域
      • 4、向外共享模块作用域中的成员
        • (1)module 对象
        • (2)module.exports 对象
      • 5、模块化规范
    • (三)npm 与包
      • 1、包
      • 2、包管理配置文件
        • (1)多人协作问题
        • (2)包管理配置文件
          • ① 快速创建 package.json
          • ② 一次性安装所有包
          • ③ 卸载包
          • ④ devDependencies
      • 3、下包速度慢
      • 4、包的分类
      • 5、创建并发布包
        • (1) 新建文件夹作为包的根目录
        • (2) 基础文件
        • (3)发布
        • (4)删除
    • (四)模块加载机制
      • 1、优先从缓存中加载
      • 2、模块加载机制
        • (1)内置模块加载优先级最高
        • (2)自定义模块加载
        • (3)第三方模块加载
        • (4)目录作为模块

一、初识 Node.js

(一)JS 解析引擎

  • 定义:解析执行JS 代码,给出运行结果
浏览器 Chrome Firefox Safri JSCore
JS 解析引擎 IE V8 OdinMonkey Chakra

(二)JS 运行环境

  • 定义:代码正常运行所需的必要环境

    • 浏览器:V8引擎 + 内置 API(BOM、DOM、Canvas、ajax、JS内置对象) + 第三方库(jQuery、art-template)
    • Node.js:V8引擎 + 内置 API(fs、path、http、JS内置对象、querystring) + 第三方库(express + mysql)

(三)Node.js

1、作用

框架 Express Electron restify
功能 构建 Web 应用 构建跨平台桌面应用 构建 API 接口项目

2、命令

  • 打开终端 win + e
  • 切换目录 cd 目标目录
  • 查看版本号 node -v
  • 执行 JS 代码 node js文件路径
  • 打开目标目录终端 shift + 文件位置鼠标右键 + powershell
  • 快速定位上一次执行命令 ↑ 键
  • 快速补全路径 tab 键
  • 快速清空当前输入命令 esc 键
  • 清空终端 cls 键

二、fs 文件系统模块

(一)fs 模块

  • 定义:Node.js 官方提供、用来操作文件的模块
  • 导入:const fs = require('fs')

(二)方法

1、fs.readFile()

  • 用法:读取指定文件内容
  • 语法:fs.readFile(path[, options], callback(err, dataStr))

path:文件路径的字符串
options:读取文件的编码格式,默认 utf8
callback: 文件读取完成后,通过回调函数拿到读取结果

  • 注意

    • 只能用来创建文件,不支持创建路径
    • 重复调用写入同一个文件,新内容覆盖旧内容

2、fs.writeFile()

  • 用法:向指定文件写入内容
  • 语法:fs.writeFile(path, data[, options], callback(err, dataStr))

data:要写入的内容

3、路径动态拼接

  • 原因:提供 ./ 或 …/ 开头的相对路径时,执行 node 命令所处目录,出现路径动态拼接错误
#mermaid-svg-ZUzhXy1qICoWjgXF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .error-icon{fill:#552222;}#mermaid-svg-ZUzhXy1qICoWjgXF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZUzhXy1qICoWjgXF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ZUzhXy1qICoWjgXF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZUzhXy1qICoWjgXF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZUzhXy1qICoWjgXF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZUzhXy1qICoWjgXF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZUzhXy1qICoWjgXF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZUzhXy1qICoWjgXF .marker.cross{stroke:#333333;}#mermaid-svg-ZUzhXy1qICoWjgXF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZUzhXy1qICoWjgXF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .cluster-label text{fill:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .cluster-label span{color:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .label text,#mermaid-svg-ZUzhXy1qICoWjgXF span{fill:#333;color:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .node rect,#mermaid-svg-ZUzhXy1qICoWjgXF .node circle,#mermaid-svg-ZUzhXy1qICoWjgXF .node ellipse,#mermaid-svg-ZUzhXy1qICoWjgXF .node polygon,#mermaid-svg-ZUzhXy1qICoWjgXF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZUzhXy1qICoWjgXF .node .label{text-align:center;}#mermaid-svg-ZUzhXy1qICoWjgXF .node.clickable{cursor:pointer;}#mermaid-svg-ZUzhXy1qICoWjgXF .arrowheadPath{fill:#333333;}#mermaid-svg-ZUzhXy1qICoWjgXF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZUzhXy1qICoWjgXF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZUzhXy1qICoWjgXF .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ZUzhXy1qICoWjgXF .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ZUzhXy1qICoWjgXF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZUzhXy1qICoWjgXF .cluster text{fill:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF .cluster span{color:#333;}#mermaid-svg-ZUzhXy1qICoWjgXF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZUzhXy1qICoWjgXF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

解决方案
盘符出发的完整路径
__dirname + '/相对路径'
移植性差不易维护
\为转义字符需要改为\\

三、path 路径模块

(一)path 模块

  • 用法:Node.js 官方提供、用来处理路径的模块
  • 导入:const path = require('path')

(二)方法

1、path.join()

  • 用法:路径片段拼接完整路径
  • 语法:path.join([paths…])
    • path.join(‘/a’,‘/b/c’,‘../’,‘./d’,‘e’) // \a\b\d\e
    • path.join(__dirname, ‘/文件名’) // 当前文件所处目录\文件名

2、path.basename()

  • 用法:从路径字符串末尾解析文件名
  • 语法:path.basename(path[, ext])
    • path.basename(‘/a/b/c/index.html’) // index.html
    • path.basename(‘/a/b/c/index.html’, ‘.html’) // index

path:完整路径字符串
ext:文件扩展名

3、path.basename()

  • 用法:获取路径扩展名
  • 语法:path.extname(path)
    • path.extname(‘/a/b/c/index.html’) // .html

四、http 模块

(一)http 模块

  • 用法:Node.js 官方提供、用来创建 web 服务器的模块
  • 导入:const http = require('http')

(二)web 服务

  • 后端:服务器安装了 web 服务器软件,使之异于普通电脑。如 IIS、Apache 等第三方 web 服务器软件
  • 前端:基于 Node.js 提供的 http 模块,通过代码手写服务器软件,从而对外提供 web 服务

(三)服务器相关概念

  • IP 地址:互联网上每台计算机的唯一地址,通常以点分十进制表示成a.b.c.d的形式,均为0-255间十进制整数
  • 域名:为了避免 IP 地址不直观且不便于记忆的问题,使用字符型地址方案
  • 域名服务器:DNS,IP 地址和域名的一一对应关系存放在域名服务器,提供 IP 地址和域名之间的转换服务
  • 端口号:一台电脑中运行众多的 web 服务,每个 web 服务都对应一个唯一的端口号。通过端口号,可以准确处理客户端发送过来的网络请求,提交给对应 web 服务进行处理
    • 每个端口号不能同时被多个 web 服务占用
    • 实际应用中,URL 的80端口可以被省略

(四)创建 web 服务器

1、创建基本 web 服务器

  • 导入 http 模块
  • 创建 web 服务器实例
  • 为服务器实例绑定 request 事件,监听客户端请求
  • 启动服务器

(1)req

  • req:请求对象,包含与客户端相关的数据和属性

    • req.url:请求地址(端口号以后)
    • req.method:请求方式

(2)res

  • res:响应对象,包含与服务器相关的数据和属性

    • 解决中文乱码:手动设置内容编码格式,res.setHeader(‘Content-Type’, ‘text/html;charset=utf-8’)
    • res.end():向客户端发送指定内容,并结束请求的处理过程
// 1、导入 http 模块
const http = require('http')
// 2、创建 web 服务器实例
const server = http.createServer()
// 3、调用 server.on() 方法,为服务器绑定 request 事件
server.on('request', (req, res) => {const str = `你请求的地址为${req.url},请求的 method 为${req.method}`// 3.1、解决中文乱码res.setHeader('Content-Type','text/html;charset=utf-8')    // 3.2、向客户端发送指定内容,并结束请求res.end(str)
})
// 4、调用 server.listen(端口号,回调) 方法,启动 web 服务器
server.listen(80, () => {console.log('http running at http://127.0.0.1');
})

2、根据不同 url 响应不同 html

  • 获取请求的 url 地址
  • 设置默认响应内容为 404 Not found
  • 判断用户请求的页面类型
  • 设置 Content-Type 响应头,防止中文乱码
  • 使用 res.end()把内容响应给客户端
server.on('request',(req, res) => {// 1、获取请求的 url 地址const url = req.url// 2、设置默认响应内容为 404 Not Foundlet content =  `<h1>404 Not Found</h1>`// 3、判断用户请求页面类型if(url === '/' || url === '/index.html'){content = `<h1>首页</h1>`}else if(url === '/about.html'){content = `<h1>关于页面</h1>`}// 4、设置 Content-Type 响应头,防止中文乱码res.setHeader('Content-Type', 'text/html; charset=utf-8')// 5、内容响应给客户端res.end(content)
})

3、实现 web 服务器

(1)核心思路

  • 把文件的实际存放路径,作为每个资源的请求 url 地址

(2)实现步骤

  • 导入需要模块
  • 创建基本的 web 服务器
  • 将资源的请求 url 地址映射为文件的存放路径
  • 读取文件内容并响应给客户端
  • 优化资源请求路径
// 1、导入模块,处理服务器、文件、路径问题
const http = require('http')
const fs = require('fs')
const path = require('path')// 2、创建web服务器
const server = http.createServer()
// 3、添加web服务器的request事件
server.on('request', (req, res) => {const url = req.url// 3.1、路径直接拼接// const fpath = path.join(__dirname, url)// 3.2、优化资源请求路径let fpath = ''if(url === '/'){fpath = path.join(__dirname, '/clock/index.html')}else{fpath = path.join(__dirname, '/clock', url)}// 4、根据映射来的文件路径读取文件fs.readFile(fpath, 'utf-8', (err, dataStr) => {if(err) return res.end('404 Not Found')// 成功读取的内容响应给客户端res.end(dataStr)})
})
// 5、启动服务器
server.listen(80, ()=>{console.log('server running at http://127.0.0.1');
})

五、Node 模块化

(一)模块化基本概念

  • 模块化:遵守固定规则,将大文件拆成独立且相互依赖的多个小模块
  • 优点
    • 提高代码复用性
    • 提升代码可维护性
    • 实现按需加载

(二)Node.js 模块分类

1、三类模块

  • 内置模块:Node.js 官方提供的,如 fs、path、http
  • 自定义模块:用户创建的每个 .js 文件
  • 第三方模块:第三方开发模块,下载后使用

2、加载模块

  • 语法:require(‘名字/路径’)
  • 区别:加载内置和第三方模块填写名字,加载自定义模块填写相对路径
  • 注意:加载模块,会执行被加载模块中的代码

3、模块作用域

  • 定义:类似函数作用域,自定义模块中的变量、方法等只能在当前模块被访问
  • 优点:防止全局变量污染

4、向外共享模块作用域中的成员

(1)module 对象

  • 每个 .js 自定义模块中都有一个 module 对象,储存当前模块相关信息
Module {id: '.',path: 'C:\\Users\\Administrator\\Desktop\\files',exports: {},filename: 'C:\\Users\\Administrator\\Desktop\\files\\module.js',loaded: false,children: [],paths: ['C:\\Users\\Administrator\\Desktop\\files\\node_modules','C:\\Users\\Administrator\\Desktop\\node_modules','C:\\Users\\Administrator\\node_modules','C:\\Users\\node_modules','C:\\node_modules']
}

(2)module.exports 对象

  • module.exports:用于自定义模块中对外共享模块内成员,外界用 require() 导入自定义模块时,得到的就是 module.exports 指定对象
  • exports:简化版代码,默认情况下 module.exports 和 exports 指向同一个对象,最终共享结果以 module.exports 指向的对象为准
  • 同一模块中,避免同时使用 module.exports 和 exports

5、模块化规范

  • Node.js 遵循 CommonJS 模块化规范——模块特性和各模块之间如何相互依赖

    • 每个模块内部,module 变量代表当前模块
    • module 变量是一个对象,其 exports 属性是对外接口
    • require() 方法用于加载模块,即加载该模块的 module.exports 属性

(三)npm 与包

1、包

  • 定义:Node.js 中的第三方模块又称包
  • 来源:第三方开发,免费且开源
  • npm:全球最大包共享平台,点此下载
  • 步骤
    • 使用 npm 包管理工具,在项目安装对应包
    • 使用 require() 导入包
    • 参考官方 API 文档使用
npm install 包名 // 完整版
npm i 包名 // 简写版
npm i 包名@版本(点分十进制:大版本.功能大版本.Bug修复版本) // 指定版
npm i 包名 --save-dev // 仅项目开发阶段使用的包复杂版
npm i 包名 -D // 仅项目开发阶段使用的包简写版

2、包管理配置文件

(1)多人协作问题

  • 第三方包体积过大,不方便团队成员共享项目源代码,需要在共享时剔除 node_modules

(2)包管理配置文件

  • 项目根目录中必有 package.json包管理配置文件,记录与项目有关的配置信息,方便剔除 node_modules 目录后,在团队成员共享项目源代码

    • 项目名称、版本号、描述
    • 项目中使用的包
    • 开发期间使用的包
    • 开发和部署期间使用的包
① 快速创建 package.json
  • 在执行命令时所处目录中,使用快捷命令 npm init -y 快速创建 package.json 包管理配置文件

    • 仅支持英文目录下运行,不支持空格
    • 运行 npm install 后,npm 包管理工具自动把包的名称版本号记录到 package.json
② 一次性安装所有包
  • 拿到剔除 node_modules 的项目后,需要先把所有包下载到项目中才能正常运行
  • 运行 npm install/i 命令,直接读取 package.json 中的 dependencies 节点,一次性下载
③ 卸载包
  • npm uninstall 包名,自动将卸载的包从 package.json 中的 dependencies 节点移除
④ devDependencies
  • 仅项目开发阶段使用的包需要 npm i 包名 -D 将包安装并记录到 devDependencies 节点
  • 开发和项目上线都使用的包 npm i 包名 将包安装并记录到 dependencies 节点

3、下包速度慢

  • 原因:npm 下包默认使用国外服务器,网络数据传输经过漫长海底电缆
  • 镜像:淘宝在国内搭建一个专门同步国外官方包的服务器,极大提高下包速度
// 查看当前下包镜像源
npm config get registry
// 将下包镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
// 检查镜像源是否下载成功
npm config get registry
  • nrm:快速查看和切换下包镜像源
// 安装 nrm 为全局工具
npm i nrm -g
// 查看所有镜像源
nrm ls
// 将下包镜像源切换为 taobao 镜像
nrm use taobao

4、包的分类

  • 全局包:npm i -g,工具性质,参考官方说明文档使用
  • 项目包:安装到项目 node_modules 目录的包
    • 开发依赖包:记录到 DevDependencies 节点中的包,仅开发期间使用
    • 核心依赖包:记录到 dependencies 节点中的包,开发和上线期间使用
  • i5thing_toc:将 md 文档转为 html 页面的工具
// 安装全局包
npm i -g i5ting_toc
// 调用包
i5ting_toc -f md文件路径 -o

5、创建并发布包

(1) 新建文件夹作为包的根目录

(2) 基础文件

  • package.json:包管理配置文件
{"name":"包名","version":"1.0.0", //版本号"main":"index.js", // 入口文件"description":"包简介","keywords":['关键词1', '关键词2', '关键词3',],"license":"ISC" // 开源许可协议
}
  • src:包功能文件
module.exports = {功能函数名} // 暴露给入口文件
  • index.js:包入口文件
const exp = require('功能文件路径') //接收功能文件
module.export = {...exp} // 暴露给外部
  • README.md:包使用说明

(3)发布

  • 将终端切换到包的根目录,运行 npm publish 命令

(4)删除

  • 运行 npm unpublish 包名 --force 命令

    • 仅支持删除72小时内发布的包
    • 删除的包24小时内不允许重复发布

(四)模块加载机制

1、优先从缓存中加载

  • 模块在第一次加载后会被缓存,多次调用 require() 不会导致模块代码重复执行,提升模块加载效率

2、模块加载机制

(1)内置模块加载优先级最高

  • Node.js 官方发布模块同名优先加载

(2)自定义模块加载

  • 必须指定以 ./ 或 …/ 开头的路径标识符,否则 node 会将其当做内置模块第三方模块加载
  • 导入自定义模块时如果忽略文件扩展名,node 会按序分别尝试加载以下文件
    • 确切文件名
    • 补全 .js 扩展名
    • 补全 .json 扩展名
    • 补全 .node 扩展名
    • 加载失败,终端报错

(3)第三方模块加载

  • 非内置模块、无路径开头时,Node.js 从当前模块的父目录开始,尝试从 node_modules 文件夹加载第三方模块
  • 如果没有找到对应第三方模块,移动到上一层父目录加载,直至文件系统根目录

(4)目录作为模块

  • 在被加载目录下查找 package.json 文件,寻找 main 属性作为 require() 加载入口
  • 如果 package.json 文件不存在或 main 入口不存在/无法解析, node.js 加载目录下的 index.js
  • 如果上述两步均失败,则 Node.js 在终端打印错误提示:Error:Cannot find module ‘xxx’

【Node.js】node入门全攻略相关推荐

  1. 首席新媒体运营黎想教程:活动运营推广入门全攻略及进阶

    本文从活动运营的框架.资源,风险,复盘等方面进行全面阐述. 先自我介绍一下,我是青岛艺形艺意文化传媒有限公司创始人,青岛首席商学院新媒体运营创始人,资深新媒体运营人,IT行业观察者,新型互联网+营销实 ...

  2. fifa足球世界 服务器维护,FIFA足球世界:新手入门全攻略,指尖传控操作让你成为大神!...

    [游戏没有圈儿,吐槽与攻略]今天抽空体验了下<FIFA足球世界>这款手游,目前来讲还是比较满意的.很多玩家关心操作会不会蹩脚,现在来告诉你它的操作与PSV版的操作方式很相似,简化到没接触过 ...

  3. Python五大主要用途+零基础基础入门全攻略

    Python可以做什么? Python的热度毋庸置疑,现在国内,不仅考国家二级计算机证需要学习Python,它甚至出现在了小学生的教材里. 那么高度如此高涨的Python,都可以用来做什么呢? 目前来 ...

  4. js操作excel全攻略

    用到了javascript操纵excel以生成报表,下面是标有详细注解的实例 <html> <head> <script language="javascrip ...

  5. Node.js的入门及模块化

    初识Node.js Node.js是一个基于Chrome V8引擎的JavaScript运行环境. 1.浏览器是JavaScript的前端运行环境 2.Node.js是JavaScript的后端运行环 ...

  6. 54 Node.js快速入门

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.Node开发概述 1.1 为什么要学习服务器端开发基础 能够与后端程序员更加紧密的配合 ...

  7. Node.js核心入门(二)

    目录: Node.js核心入门(一) 全局对象 常用工具 事件机制 Node.js核心入门(二) 文件系统访问 HTTP服务器与客户端 文件系统 fs fs 模块是文件操作的封装,它提供了文件的读取. ...

  8. Node.js:入门资料

    <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm.html <N ...

  9. Node.js基础入门

    Node基础 Node快速体验 1. Node介绍 1.1. Node.js是什么 Node 是一个基于Chrome V8 引擎的JavaScript 运行环境. Node 不是一种独立的语言. No ...

最新文章

  1. 基于Spark ML 聚类分析实战的KMeans
  2. 快速排名系统询火星推荐_搜狗网站快速排名系统 - 新站权重如何快速提升
  3. cpuz北桥频率和内存频率_内存频率不是越高越好:寻找三代锐龙的最佳频率
  4. python自动访问网页_Python自动化 selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?...
  5. undefined reference to `std::cout'等错误
  6. security安全表达式介绍
  7. 这年头,千万不要花钱创业
  8. 【短语学习】out of the box的含义和翻译
  9. STM32:配置定时器为PWM输出模式以及编码器接口模式
  10. Java扫雷游戏的设计与实现毕业设计论文
  11. 中美线径对照表_AWG 与国际线径对照表
  12. python贪吃蛇_python实现贪吃蛇
  13. 【Pytorch】ResNet-18实现Cifar-10图像分类
  14. 云打印SDK来袭,支持飞鹅云,芯烨云,易联云,优声云等云打印机
  15. Ubuntu 启动图标变成问号
  16. CentOS6.5服务器端口捆绑
  17. 一文让你初步了解壮族——一个奇葩但同样优秀的民族
  18. android平板投影到电视,平板投屏到电视机如何操作可以互投
  19. RecSys‘22 推荐系统论文梳理
  20. SpringBoot学习+秒杀项目

热门文章

  1. PCB布局布线中地的设计
  2. python面向过程学习笔记
  3. 【锐捷交换机】版本升级
  4. Android11 HAL层开发
  5. 安全运营四要素之资产、脆弱性、威胁和事件
  6. 关于M1卡的SAK--其实都在前面函数的返回中
  7. 子网掩码和prefixlength
  8. 阿语python美多商城-商品-购物车之第7.1节购物车存储方案
  9. 如何在2小时内用1块钱赚到100块钱?
  10. 2020电子设计大赛E题复盘