path是Node.js内置的模块,通过调用相关的方法可以对文件路径进行拼接,读取等
1、相对路径和绝对路径
为什么要引入path模块在操纵文件路径,直接写绝对路径或者相对路径不可以吗?
不可以,有问题。
- 相对路径的问题
写代码时的相对路径是指相对这个正在写的文件的路径。运行代码的路径,则是你node节点启动的路径。如果不在同一个文件夹里,就找不到那个相对的文件了,出现错误 - 绝对路径的问题
不会错误,但是不好,维护麻烦,容易出错;代码太长,很难读懂。
绝对路径往往很长,如果路径上的一个文件夹或者文件改名了,就会出错。
2、path模块的API
const fpath = 'E:\nodejs\fs\path.js'
path.join(...options); // 比字符串相加好,因为字符串不会读懂'./'
path.basename(fpath); //返回文件名 path.js
path.extname(fpath); //返回后缀名 .js
3、小练习——拆分HTML文件
- 已有一个HTML文件
index.html
,其中有style和script标签 - 想将样式和js提取出来,分别存到new文件夹中
- 最后new文件夹有三个文件
index.html
,index.css
,index.js
// 拆分HTML文件
// 1引入fs path模块
const fs = require('fs');
const path = require('path');
// 正则表达式
// <style>之间的正则 \s空白字符 \S非空白字符 *任意多次
const regStyle = /<style>[\s\S]*<\/style>/;
const regScript = /<script>[\s\S]*<\/script>/;
// 2 读取HTML文件
const fpath = path.join(__dirname, './file/index.html');
fs.readFile(fpath,'utf8',(err,data)=>{
if(err) throw console.error(err.message);
resolveCSS(data);
resolveJS(data);
resolveHTML(data);
});
// 拆分为函数 功能 or 处理对象
function resolveCSS(data){
// 获取style标签之间的部分
let cssStr = data.match(regStyle)[0];
// 去掉style标签
cssStr = cssStr.replace('<style>','').replace('</style>','');
// 存储文件
fs.writeFile(path.join(__dirname,'./clock','index.css'),cssStr,(err)=>{
if(err) throw err;
});
}
function resolveJS(data){
// 获取script标签之间的部分
let jsStr = data.match(regScript)[0];
// 去掉script标签
jsStr=jsStr.replace('<script>','').replace('</script>','');
// 存储文件
fs.writeFile(path.join(__dirname,'./clock','index.js'),jsStr,(err)=>{
if(err) throw err;
});
}
function resolveHTML(data){
const css = '<link rel="stylesheet" href="./index.css" />';
const js = '<script src="./clock/index.js"></script>';
const htmlStr = data.replace(regStyle,css).replace(regScript,js);
// 存储文件
fs.writeFile(path.join(__dirname,'./clock','index.html'),htmlStr,(err)=>{
if(err) throw err;
});
}
4、感悟
①函数抽象🍔
将复杂的逻辑拆成好用的函数,可以从两个方面思考。以这个练习为例
1 面向功能
正则提取字符串-》处理字符串-》输出字符串
若对每个步骤分别抽象出一个处理函数,因为同时要对三个文件操作,每个函数的接口非常多,不利于处理。所以不适合这种场景
2 面向对象
涉及到三个文件对象的处理,三个文件处理细节上有所不同,所以给每个文件都设置一个处理函数。
②正则规则
尖括号不需要转译<>
正则还是要学学