搭建服务器时引入的相关文件
一、express 的理解
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。
Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。Express 不对 node.js 已有的特性进行二次抽象,我们只是在它之上扩展了Web应用所需的功能。丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单
二、ejs 的理解
EJS是一个JavaScript模板库,用来从JSON数据中生成HTML字符串。可以让代码更加干净整洁,让人易懂。
优点:
1.SEO,让搜索引擎更容易读取页面内容
2.首屏渲染速度更快(重点),无需等待js文件下载执行的过程
3.更易于维护,服务端和客户端可以共享某些代码
在推崇前后端分离的情况下又回归服务端渲染主要是项目中初次渲染比较慢或者说需要SEO的原因。
三、path 的理解
获取路径:path.dirname()
获取文件名(带有扩展名):path.basename()
获取文件名(没有扩展名):path.basename( , ".后缀")
获取文件的扩展名:path.extname()
路径连接:path.join()
转化成绝对路径:path.resolve()
解析路径 :
path.parse(){
root : 根路径
dir : 路径名
base : 文件名.后缀名
ext : 后缀名
name : 文件名,不包括后缀名
}
四、 fs 模块的介绍
fs(file system)模块是nodejs提供的用于访问本地文件系统的功能模块,它使得运行于nodejs环境下的JavaScript具备直接读写本地文件的能力。
fs模块是nodejs的核心模块之一,只要安装了nodejs,就可以直接使用,不需要单独安装。引入fs模块非常简单:
let fs = require('fs');
接下来就可以调用fs模块的相关接口直接读写文件系统。
fs模块主要提供了以下的接口类:
fs.Dir,目录类。可理解为文件夹。
fs.Dirent,目录项类。通过Dir类的返回值获得,表示该目录下的一个子项,可能是文件或子目录。
fs.FSWatcher,文件监听类,它可以为一个文件创建一个监听器,当文件变化时触发回调。
fs.StatWatcher,调用fs.watchFile()方法之后的返回值类型,主要用于协助控制事件循环。
fs.ReadStream,读取流。当流式读取文件时需要使用该类。
fs.Stats,文件元信息类。通过该类可以获取文件相关信息(如文件类型、文件大小、文件描述符等)。
fs.WriteStream,写入流。当流式写入数据时需要使用。
除了以上的类,fs模块还提供了非常多的实例方法,它们可以直接通过fs调用,如读取文件的方法reafFile:
let fs = require('fs');
fs.readFile('./README.md', function(err, data) = {
if (err) throw err;
... // 处理数据
})
该函数以异步的方式读取文件,以可能抛出的异常作为回调函数的第一个参数(这样设计的目的是“强制”或者“提醒”开发者去处理可能出现的异常),而真正的文档数据则作为第二个参数。
fs模块中几乎所有默认的读写函数都是异步的,不过它也同时提供了这些函数的同步版本,一般是在函数后面加Sync。如上面的代码还可以用readFileSync改写:
let fs = require('fs');
try {
let data = fs.readFileSync('./README.md', 'utf8');
} catch(e = {
console.error(e);
})
大多数情况下,nodejs推荐使用异步版本的读写函数来提升系统性能。而如果要使用同步版本的函数,应该尽可能使用try catch捕获异常,以防止读写失败造成主线程崩溃。
五、 对于 var root = process.cwd() 的理解
在项目中经常看到process.cwd(),他和__dirname有什么区别呢?
这是在网络上经常能搜到的答案,但是有种什么都说了但是又什么都没说的感觉。
process.cwd() 是当前Node.js进程执行时的文件夹地址——工作目录,保证了文件在不同的目录下执行时,路径始终不变
__dirname 是被执行的js 文件的地址 ——文件所在目录
详细展示描述一下:
__dirname 是被执行的js 文件的地址 ——文件所在目录
__dirname: 当前模块的目录名。 等同于 __filename 的 path.dirname()。__dirname 实际上不是一个全局变量,而是每个模块内部的。
当我们不同的目录下面打印__dirname的时候,结果也是不同的,这也是他跟process.cwd()最大的区别。
process.cwd() 是当前Node.js进程执行时的文件夹地址
简单说就是执行命令====== node 文件地址(命令行)
的时候的文件夹地址,如 node file.js,则这个时候process.cwd()就是file.js文件所在的目录地址.
但是为什么说process.cwd()保证了文件在不同的目录下执行时,路径始终不变??
这其实跟vue、react等项目的启动打包原理相关,即跟npm run dev/serve/start…的原理相关。
当我们执行启动或打包命令时,如npm run start,脚手架就会到项目的根目录下寻找一个叫:package.json 的文件。
我们可以看到start对应的命令为node scripts/start.js,然后就会开始执行这个命令,那么package.json所在目录就是process.cwd()的结果。因为这个文件基本不会动,就在项目根目录/下,所以我们在全局使用的时候这个地址也不会变。