Nodejs学习之path模块
什么是path模块?
path模块也是node.js官方提供的用于处理路径的模块,用于满足对路径处理的需求。
如果要在JavaScript中使用path模块同样也需要用如下方式进行导入
const path = require('path')
常用的方法有:
-
path.join() :将多个路径片段拼接成一个完整的路径字符串
-
path.basename() :从路径字符串中将文件名解析出来
一、path.join( )
const path = require('path') // 注意 ../ 会抵消前面的路径 const pathStr = path.join('/a','/b/c','../', './d', 'e') // join方法会对路径进行一个拼接 console.log(pathStr) // 输出了'/a/b/d/e' 其中的 /c 被 ../ 抵消掉了 /*-------------------------------------------*/ const pathStr2 = path.join(__dirname,'./files/成绩.txt') console.log(pathStr2) // 输出'/Users/trillion-star/Desktop/node学习/files/成绩.txt'
以后在拼接路径的时候不要在使用“+”拼接路径,而使用join方法,如:
const fs = require('fs') const path = require('path') fs.readFile(path.join(__dirname,'/files/成绩.txt'),'utf-8',function(err,dataStr){ if(err){ return console.log('读取文件失败:'+err.message) } console.log('读取文件成功:'+dataStr) })
二、path.basename( )
该方法可以获取路径中的最后一部分,路径终点的文件名,语法如下:
path.basename(path[,ext])
参数一、path,必选参数,路径的字符串
参数二、[ ext ],可选参数,文件扩展名
调用返回值、路径中的最后一部分
代码示例:
const path = require('path') // 定义一个文件的存放路径 const fpath = 'a/b/c/index.html' // 从文件路径中获取到文件名 const fullName = path.basename(fpath) //const fullName = path.basename(fpath,'html')// 剔除扩展名,只保留文件名 console.log(fullName) // 打印得到结果"index.html" /*---------------------------*/ console.log(path.extname(fullName)) //获取路径中的文件扩展名 .html
练习,
目的: 将素材clock中index.html页面的html/css/javaScript代码进行拆分
实现步骤:
一、创建正则表达式来匹配style标签和html标签
二、使用fs模块读取要被处理的HTML文档
三、自定义resolveCSS/resolveHTML/resolveJS方法,写入index.CSS/index.HTML/index.JS文件
1、读取到文档,定义正则,调用方法
const fs = require('fs') const path = require('path') // 创建正则表达式来匹配style标签和script标签 // \s表示空白字符,\S表示非空白字符 *表示任意字符 const regStyle = /<style>[\s\S]*<\/style>/ const regScript = /<script>[\s\S]*<\/script>/ //读取需要被处理的HTML文档 fs.readFile(path.join(__dirname,'./clock/index.html'),'utf-8',function(err,dataStr){ if(err){ return console.log('读取失败:'+err.message) } // console.log(dataStr) //读取成功 // 调用方法,将dataStr传入,分别拆解css,js,html文件 resolveCSS(dataStr) resolveScript(dataStr) })
2、定义方法
// 自定义处理css样式的方法 // 用htmlStr来接收传入的dataStr function resolveCSS(htmlStr){ //调用正则提取需要的内容 const r1 = regStyle.exec(htmlStr) //将提取出来的样式字符串进行替换,将<style>标签替换成空字符串 const newCSS = r1[0].replace('<style>','').replace('</style>','') // 将样式内容写如进新的文件中 fs.writeFile(path.join(__dirname,'./clock/index.css'), newCSS,function(err){ if(err) return console.log('写入CSS失败:',err.message) console.log('写入CSS成功') }) } // 自定义处理JavaScript样式的方法 // 用htmlStr来接收传入的dataStr function resolveScript(htmlStr){ const r2 =regScript.exec(htmlStr) const newScript = r2[0].replace('<script>','').replace('</script>','') //将获取到的样式写入新的文件中 console.log(newScript) fs.writeFile(path.join(__dirname,'./clock/index.js'), newScript,function(err){ if(err) return console.log('写入JS失败:',err.message) console.log('写入JS成功') }) }
3、定义方法将提取出来的js和css用链入式写入HTML文档中
// 自定义处理HTML结构的方法 function resolveHTML(htmlStr){ // 将字符串调用 replace 把内嵌的 style 和 script 标签替换为‘链入式’标签 const newHTML = htmlStr.replace(regStyle,'<link rel="stylesheet" href="./index.css" />') .replace(regScript,'<script src="./index.js"></script>') // 写入金index.html文件中 fs.writeFile(path.join(__dirname,'./clock/index.html'),newHTML,err=>{ if(err) return console.log('写入HTML失败:',err.message) console.log('写入HTML成功') }) }
4、成功运行
注意点
- fs.writeFile方法可以用来创建文件并写入,但无法创建路径与文件夹。
- 重复调用fs.writeFile方法写入同一个文件的时候,新写入的内容会覆盖掉原先的旧内容,且不可逆。