资讯专栏INFORMATION COLUMN

nodejs分离html文件里面的js和css

dailybird / 2904人阅读

摘要:摘要本文要实现的内容,使用对文件的增删改查,演示的例子分离出一个文件里面的和里面的内容,然后多带带生成文件和文件。下面是执行一个主方法的一个过程欢迎评阅和指正我是贰伶迩

摘要: 本文要实现的内容,使用nodejs 对文件的增删改查,演示的例子-》分离出一个html 文件里面的script 和style 里面的内容,然后多带带生成js文件和css 文件。中间处理异步的api-》async/await , Promise

项目托管:extract-js-css , 欢迎star

直接上代码:

// extract-js-css
// import fs from "fs"
var fs = require("fs")
// import csscomb from "csscomb"
// var csscomb = require("csscomb")
// var comb = new csscomb("zen");
// console.log(comb)

// 删除文件
const deleteFile = (path)=>{
    return new Promise(resolve => {
        fs.unlink(path, (err) => {
            if (err) {
                console.log(err)
                return
            };
            console.log(`已成功删除 ${path}文件`);
            resolve()
        });
    })
}

// 删除文件夹
const deleteDir = async (path)=>{
    let  _files =  await new Promise (resolve => {
        fs.readdir(path, (err,files) => {
            if (err) {
                console.log(err)
            };
            console.log(`已成功读取 ${path} 文件夹`);
            resolve(files)
        })
    })

    if(_files && _files.length) {
        for(let i =0;i<_files.length;i++) {
            // console.log(_files[i],"innnnnn")
           await deleteFile("./test/"+ _files[i])
        }
    }
    // console.log("delete hou")

    await new Promise(resolve => {
        fs.rmdir(path, (err) => {
            if (err) {
                console.log(err)
            };
            console.log(`已成功删除空 ${path}文件夹`);
            resolve()
        })
    });
}
const emptyDir = (path) => {
    return new Promise(resolve => {
        fs.rmdir(path, (err) => {
            if (err) {
                console.log(err)
            };
            console.log(`已成功删除空 ${path}文件夹`);
            resolve()
        })
    })
}
// 新建文件夹
/**
 *  
 */
const mkdirTest = ()=>{
    return new Promise(resolve => {
        fs.mkdir("./test", { recursive: true }, (err, data)=>{
            if (err) {
                console.log(err)
            };
            console.log("新建文件夹成功")
            resolve()
        })
    })
}

// 读取html 内容
/**
 * 
 */
const readHtml = ()=>{
    return new Promise(resolve => {
        fs.readFile("./test.html", "utf-8", (err, data)=>{
            if(err) {
                throw Error(err)
            }
            console.log("test.html 读取成功!--NO1")
            resolve(data)
        })
    })
}

// 写入css 和js
/**
 * 向文件中追加内容
 * @param {是文件名字} path 
 * @param {写入文件的内容} data 
 * @param {文件类型} type 
 * @author erlinger
 * @time 
 */
const appendFile = (path, data, type) => {
    return new Promise(resolve => {
        fs.appendFile(path, data, (err) => {
            if (err) {
                console.log(err)
            };
            console.log(`${type}数据已追加到文件`);
            resolve()
        });
    })
}
// 写一个html
const writeHtml = (path, data) => {
    return new Promise(resolve => {
        fs.writeFile(path, data, (err) =>{
            if(err) {
                console.log("err", err)
                return
            }
            console.log(`${path} 写入成功,功能结束!`);
            resolve() // 必须resolve 。不然 promise 就到此为止,调用该方法后面的代码将不执行
        })
    })
}

// 插件 方法入口
(async ()=>{
    console.log("==========================game-start=============================");
    await deleteDir("./test");
    console.log("我应该是等---删除文件夹后---才出现")

    await mkdirTest();
    console.log("我应该是在---文件夹新建成功---后出现!");

    let cssReg = /[s|S]*?/ig;
    let jsReg = /[s|S]*?/ig;
    let allStyleReg = /[s|S]*?/ig;
    let allScriptReg = /[s|S]*?/ig;
    let cssLink = "";
    let jsrc = "";
    let styleCollection, scriptColletion;
    let cssContent = "", jsContent = "", htmlContentStr = "";

    let originContent = await readHtml();
    styleCollection = originContent.match(cssReg);
    scriptColletion = originContent.match(jsReg);
    
    // 处理 css
    for (let i =0;i/g,"").replace(//g, "").replace(/("")/g,"")
    
    for (let i =0;i/g,"").replace(//g, "")
    .replace(/"*/g, "").replace(/("")/g,"")
    
    await appendFile("./test/test.css", JSON.parse(cssContent), "css");
    console.log("我应该是在---css写入成功---后出现!");

    await appendFile("./test/test.js", JSON.parse(jsContent), "js");
    console.log("我应该是在---js写入成功---后出现!");

    htmlContentStr = originContent
    .replace(allStyleReg, "")
    .replace(cssReg, cssLink)
    .replace(allScriptReg, "")
    .replace(jsReg, jsrc);
    console.log("copyTest.html 文本已经格式化,准备写入");
    await writeHtml("./test/copyTest.html", htmlContentStr);

    console.log("==========================game-over=============================");
})()

关于async/await 的学习推荐:async/await

代码确实没什么好解释的,慢慢看就明白了。运行:
node extract-js-css

如果你要使用 es6 module,用 import 导入方法,需要多带带装一个babel,使用这个包去编译成es5,在运行,具体使用可以down项目运行一下。
针对此项目,需要提醒说明以下:

对文件的处理都是异步操作,如果是单一的一个异步操作方法(比如:appendFile 方法),它就是往文件里面异步添加内容,直接封装成一个promise,然后 return 出来就好。

如果一个操作里面包含多个异步处理逻辑的就需要在这个方法里面,用async 声明方法,用await 等待异步操作,最后return 出去一个promise

在执行主流程中,我们用async声明的方法进行调用(我这里是匿名函数直接调用) ,用await 进行等待异步操作,这样我们的主流程就是一个同步的执行的流程,看起来很爽朗。

文中的异步操作文件的api 方法是异步的,nodejs 开发文档提供了同步操作文档,大家可以直接使用同步的api。我这里主要是联系在异步操作的过程中,使用async/ await promise 方法,更好的掌握它。

文中的一个demo 提供了处理多个异步、一个异步操作里面包含多个异步操作,包括在循环里执行异步操作 的一个方案,里面具体针对HTML 文件的字符串处理,比较搓搓,在用正则匹配和字符串格式化和解析字符串的情况比较单一。在读取完文件内容后,需要 JSON.stringify,后来在填入文件中的时候要 JSON.parse , 目前没找到合适的方法,如果有大佬有合适的方法,欢迎告知与我,大家一起交流。

下面是 执行一个主 async方法的一个过程

欢迎评阅和指正!我是贰伶迩

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103352.html

相关文章

  • 如何打造一个令人愉悦前端开发环境(一)

    摘要:我觉得这方面的原因是当时对和的依赖,导致大家对的兴趣不弄,错过了最佳时机,这个其实跟百度自己的的技术栈有很大关系。这个阮一峰对于前端构建的变化吐槽过,说新的构建工具就是的构建工具。 文章来源 最近几年,前端发展越来越迅速,各种萌新加入了前端这个大家庭,大有赶IOS、超Android的趋势呀!同时,萌新们提出了各种前端工作问题,除了最基础的html、css、js三板斧之外,最让人头疼的应...

    KavenFan 评论0 收藏0
  • 如何打造一个令人愉悦前端开发环境(一)

    摘要:我觉得这方面的原因是当时对和的依赖,导致大家对的兴趣不弄,错过了最佳时机,这个其实跟百度自己的的技术栈有很大关系。这个阮一峰对于前端构建的变化吐槽过,说新的构建工具就是的构建工具。 文章来源 最近几年,前端发展越来越迅速,各种萌新加入了前端这个大家庭,大有赶IOS、超Android的趋势呀!同时,萌新们提出了各种前端工作问题,除了最基础的html、css、js三板斧之外,最让人头疼的应...

    Yangyang 评论0 收藏0
  • webpack工程化集成React技术栈(一)

    项目开始前,我们先聊一聊关于项目的一些说明。该项目起始于2017年初,当时公司主要技术栈为gulp+angular,鉴于react的火热的生态,在公司决定研发bss管理系统时选用react开发,目的也是为react native打下基础,以解决后期公司大前端技术栈的逐步成熟。(当时没有选择vue开发的主要原因是weex生态还不够特别成熟),既然决定换新,项目的构建也跟着一起换,从gulp转向火热的...

    tianhang 评论0 收藏0
  • 用gulp+mock实现前后端分离

    摘要:当然需要的工具不只有这些,其他的一些可选工具还有文件压缩压缩时用到的文件重命名检查一般编辑器自带校验提示工具等等,具体根据项目需要安装。 gulp 前端自动化构建工具 需要配置nodejs环境, 利用npm安装全局gulp,安装后可以输入gulp指令。 npm install gulp -g 创建项目目录、初始化npm包、gulp npm init gulp init 下载gul...

    dailybird 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<