2024-03-07-Nodejs(1-Node基础)
1.初识Nodejs
1.1 思考
-
为什么js可以在浏览器中被执行?
浏览器中具备js解析引擎,其中chrome浏览器的v8引擎最优。
-
为什么js可以操作DOM和BOM?
每个浏览器都内置了DOM和BOM这样的api函数,因此浏览器中的js才可以调用它们。
-
js运行环境
运行环境是指代码正常运行所必须的环境。
-
v8引擎负责解析和执行js代码
-
内置api是由运行环境提供的特殊接口,只能在所属的运行环境中被调用
-
-
js能够做后端开发
可以,使用nodejs运行环境就行了。
1.2 node.js简介
-
什么是node.js
node.js是一个基于chrome v8引擎的js运行环境
-
node.js中的js运行环境
- 浏览器是js的前端运行环境
- node.js是js的后端运行环境
- node.js中无法调用DOM和BOM等浏览器的内置API
-
node.js可以做什么?
node.js作为一个js的运行环境,仅仅提供了基础的功能和API。然而基于node.js提供的这些基础能力,很多强大的工具和框架如雨后春笋般层出不穷:
- 基于express,可以快读构建web应用
- 基于electron框架可以构建跨平台的桌面应用
- 基于restify可以快速构建API接口项目
- 读写和操作数据库、创建实用的命令行工具辅助前端开发等等
node.js是大前端时代的大宝剑,有了node.js的超级buff加持,前段程序员行业竞争力会越来越强。
-
node好学吗?
好学
-
nodejs的学习路径
js基础语法+nodejs内置模块(fs,path,http等)+第三方模块(express + mysql)
2. fs系统模块
fs模块式node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求
2.1 读取文件 - fs.readFile()
// 读取指定文件中的内容 fs.readFile(path[, options], callback(err,data))
path
:文件路径- options :配置选项,若是字符串则指定编码格式
encoding
:编码格式,一般指定utf-8
flag
:打开方式- callback :回调函数
err
:错误信息,如果读取成功,返回null;如果失败,就是错误对象data
:读取的数据,如果未指定编码格式则返回一个 Buffer;读取失败返回undefine
const fs = require("fs"); fs.readFile("./data/1.txt", "utf-8", function (error, dataStr) { if (error) { return console.log("读取文件失败\n错误内容:" + error.message); } console.log("读取文件成功\n内容是:" + dataStr); });
输出结果
读取文件成功 内容是:这是nodejs文本
2.2 写入文件 - fs.writeFile()
fs.writeFile(file, data[, options], callback(error))
file
:文件路径data
:写入内容options
:配置选项,包含encoding, mode, flag
;若是字符串则指定编码格式callback
:回调函数,文件写入成功,error的值为null
;如果写入失败,error的值为一个错误对象
const fs = require("fs") fs.writeFile( "./data/hello.txt", "通过 writeFile 写入的内容", { flag: "w" }, function (err) { if (!err) { console.log("写入成功!"); } else { console.log(err); } } );
2.3 案例
整理考试成绩
chengji.txt
小红=100,小明=98,小芳=95,小亮=88,小吴=79
转换为chengji_ok.txt
,格式如下
小红:100 小明:98 小芳:95 小亮:88 小吴:79
chengji.js
const fs = require("fs"); // 1. 读取文件 fs.readFile("./data/chengji.txt", "utf-8", function (err, dataStr) { if (err) { console.log("读取文件失败\n" + err.message); } // 2. 处理数据 const arrNew = []; const arrOld = dataStr.split(" "); arrOld.forEach((item) => { arrNew.push(item.replace("=", ":")); }); const newStr = arrNew.join("\r\n"); // 3. 写出数据 fs.writeFile("./data/chengji_ok.txt", newStr, function (err) { if (err) { console.log(err.message); } console.log("成绩写入成功") }); });
2.4 路径动态拼接
- 在使用 fs 模块操作文件时,如果提供的操作路径是以
./
或../
开头的相对路径时,容易出现路径动态拼接错误的问题 - 原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径
- 解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题
__dirname
获取文件所处的绝对路径
console.log(__dirname) const fs = require("fs"); fs.readFile(__dirname + "/data/1.txt", "utf-8", function (error, dataStr) { if (error) { return console.log("读取文件失败\n错误内容:" + error.message); } console.log("读取文件成功\n内容是:" + dataStr); });
输出结果
D:\03_Learn\12_node 读取文件成功 内容是:这是nodejs文本
3. path
3.1 路径拼接 path.join()
path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
const path = require("path") const pathStr = path.join("/a",'/b/c') console.log(pathStr)
输出结果
\a\b\c
3.2 获取路径文件名 path.basename()
使用 path.basename()
方法,可以获取路径中的最后一部分,常通过该方法获取路径中的文件名
path.basename(path[, ext]) // path: 文件路径 // ext: 文件扩展名
const path = require('path') // 定义文件的存放路径 const fpath = '/a/b/c/index.html' const fullName = path.basename(fpath) console.log(fullName) // index.html const nameWithoutExt = path.basename(fpath, '.html') console.log(nameWithoutExt) // index
输出结果
index.html index
3.3 获取路径中文件扩展名 path.extname()
const path = require('path') const fpath = '/a/b/c/index.html' const fext = path.extname(fpath) console.log(fext) // .html
输出结果
.html
4.http
http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。
const http = require('http')
4.1 创建基本 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') })
访问127.0.0.1:8080
4.2 实现简陋路由效果
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, () => { console.log('server running at http://127.0.0.1') })
5.模块化
5.1 模块化概念
- 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程,模块是可组合、分解和更换的单元。
- 模块化可提高代码的复用性和可维护性,实现按需加载。
- 模块化规范是对代码进行模块化拆分和组合时需要遵守的规则,如使用何种语法格式引用模块和向外暴露成员。
5.2 Node.js 中模块的分类
- 内置模块 (由nodejs官方提供,如fs,path,http等)
- 自定义模块
- 第三方模块
// 使用require()方法加载模块,可以加载内置模块、自定义模块和第三方模块 const fs = require('fs') const custom = require("./custom") // 可以省略.js后缀名 // 注意: 在使用require()方法加载模块,会执行加载模块中的代码
5.3 Node.js 中的模块作用域
- 和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域
- 防止全局变量污染
5.4 模块作用域的成员
- 自定义模块中都有一个
module
对象,存储了和当前模块有关的信息 - 在自定义模块中,可以使用
module.exports
对象,将模块内的成员共享出去,供外界使用。 - 在外界使用
require
导入自定义模块时,得到的就是module.exports
指向的对象。 - 默认情况下,
exports
和module.exports
指向同一个对象。最终共享的结果,以module.exports
指向的对象为准。
10_module01.js
module.exports.name = "zs" module.exports.say = ()=>{ console.log("info") }
11_module.js
const m = require("./10_module01") console.log(m)
执行结果
D:\03_Learn\12_node>node 11_module.js { name: 'zs', say: [Function (anonymous)] }
当然,上面的10_module01.js
的代码可以写成
module.exports = { name: "zs", say: ()=>{ console.log("info") } }
由于module.exports
写起来比较复杂,为了简化向外共享成员的代码,node提供了exports
对象。
默认情况下,exports
和module.exports
指向同一个对象,最终共享的结果还是以module.exports
的指向的对象为准
5.5 CommonJS 模块化规范
Nodejs遵循Commonjs模块化规范,Commonjs规定了模块的特性和各模块之间如何互相依赖
- 每个模块内部,
module
变量代表当前模块 module
变量是一个对象,module.exports
是对外的接口- 加载某个模块即加载该模块的
module.exports
属性
5.6 npm与包
nodejs的第三方模块就是包,就像电脑和计算机值得是相同的东西一样,第三方模块和包指的是同一个概念,只是不同的叫法而已。
包的来源:
不同与nodejs中的内置模块和自定义模块,包是第三方个人或者团队开发出来的,免费供开发者使用
由于nodejs内置的模块仅仅提供了一些底层的API,导致内置模块进行项目开发时,效率较低。包是基于内置模块封装出来的,提供了更高级更方便的API,提高了开发效率。
包的下载:
国外有一家 IT 公司,叫做 npm.Inc.这家公司旗下有一个非常著名的网站: https://www.npmjs.com/
,它是全球最大的包共享平台,你可以从这个网站上搜索到任何你需要的包,只要你有足够的耐心!
迄今为止,全球约 1100 多万的开发人员,通过这个包共享平台,开发并共享了超过 120 多万个包供我们使用。
npm.Inc公司提供了一个地址为 https://registry.npmjs.org/
的服务器,,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。
npm.Inc公司提供了一个包管理工具 Node Package Manager(简称 npm 包管理工具)
,这个包管理工具随着 Node.js 的安
装包一起被安装到了用户的电脑上。

npm install 包的名称 # 或者 npm i 包的名称
# 安装指定版本的包 npm i 包的名称@包的版本 # 如 npm i moment@2.24 # 包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0其中每一位数字所代表的的含义如下: # 第1位数字:大版本 # 第2位数字:功能版本 # 第3位数字:Bug修复版本
5.7 npm镜像源
# 查看当前镜像源 npm config get registry # 切换淘宝镜像源 npm config set registry=https://registry.npm.taobao.org/
使用nrm工具切换可用镜像源
# 安装nrm npm i nrm -g # 查看所有可用镜像源 nrm ls # 切换 nrm use taobao
PS C:\Users\zheng\Desktop> nrm ls npm ---------- https://registry.npmjs.org/ yarn --------- https://registry.yarnpkg.com/ tencent ------ https://mirrors.cloud.tencent.com/npm/ cnpm --------- https://r.cnpmjs.org/ taobao ------- https://registry.npmmirror.com/ npmMirror ---- https://skimdb.npmjs.com/registry/
本文来自博客园,作者:Yasuo_Hasaki,转载请注明原文链接:https://www.cnblogs.com/hasaki-yasuo/p/18072307
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步