从零开始Node.js—02文件路径的使用

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文件

  1. 已有一个HTML文件index.html,其中有style和script标签
  2. 想将样式和js提取出来,分别存到new文件夹中
  3. 最后new文件夹有三个文件index.htmlindex.cssindex.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 面向对象
涉及到三个文件对象的处理,三个文件处理细节上有所不同,所以给每个文件都设置一个处理函数。

②正则规则

尖括号不需要转译<>
正则还是要学学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值