path模块的API
const fpath = 'E:\nodejs\fs\path.js'
path.join([...options]);
path.basename(fpath); //返回文件名 path.js
path.extname(fpath); //返回后缀名 .js
小练习——拆分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;
});
}
感悟
1、函数抽象🍔
将复杂的逻辑拆成好用的函数,可以从两个方面思考。以这个练习为例
1 面向功能
正则提取字符串-》处理字符串-》输出字符串
若对每个步骤分别抽象出一个处理函数,因为同时要对三个文件操作,每个函数的接口非常多,不利于处理。所以不适合这种场景
2 面向对象
涉及到三个文件对象的处理,三个文件处理细节上有所不同,所以给每个文件都设置一个处理函数。
2、正则规则
尖括号不需要转译<>
正则还是要学学