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


Posted in NodeJs onApril 09, 2019

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

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

直接上代码:

// 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 = /<style>[\s|\S]*?<\/style>/ig;
  let jsReg = /<script>[\s|\S]*?<\/script>/ig;
  let allStyleReg = /<\/style>[\s|\S]*?<style>/ig;
  let allScriptReg = /<\/script>[\s|\S]*?<script>/ig;
  let cssLink = '<link rel="stylesheet" href="./test.css" rel="external nofollow" >';
  let jsrc = '<script src="./test.js"></script>';
  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<styleCollection.length;i++) {
    cssContent += JSON.stringify(styleCollection[i]);
  }

  cssContent = cssContent.replace(/<style>/g,'').replace(/<\/style>/g, '').replace(/("")/g,'')
  
  for (let i =0;i<scriptColletion.length;i++) {
    jsContent += JSON.stringify(scriptColletion[i]);
  }
  
  jsContent = jsContent.replace(/<script>/g,'').replace(/<\/script>/g, '')
  .replace(/<\/script>"*<script>/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=============================');
})()

代码确实没什么好解释的,慢慢看就明白了。需要提醒以下:

  1. 对文件的处理都是异步操作,如果是单一的一个异步操作方法(比如:appendFile 方法),它就是往文件里面异步添加内容,直接封装成一个promise,然后 return 出来就好。
  2. 如果一个操作里面包含多个异步处理逻辑的就需要在这个方法里面,用async 声明方法,用await 等待异步操作,最后return 出去一个promise
  3. 在执行主流程中,我们用async声明的方法进行调用(我这里是匿名函数直接调用) ,用await 进行等待异步操作,这样我们的主流程就是一个同步的执行的流程,看起来很爽朗。
  4. 文中的异步操作文件的api 方法是异步的,nodejs 开发文档提供了同步操作文档,大家可以直接使用同步的api。我这里主要是联系在异步操作的过程中,使用async/ await promise 方法,更好的掌握它。
  5. 文中的一个demo 提供了处理多个异步、一个异步操作里面包含多个异步操作,包括在循环里执行异步操作 的一个方案,里面具体针对HTML 文件的字符串处理,比较搓搓,在用正则匹配和字符串格式化和解析字符串的情况比较单一。在读取完文件内容后,需要 JSON.stringify,后来在填入文件中的时候要 JSON.parse , 目前没找到合适的方法,如果有大佬有合适的方法,欢迎告知与我,大家一起交流。

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs npm包管理的配置方法及常用命令介绍
Jun 05 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
May 15 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 #NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 #NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 #NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 #NodeJs
详解nodejs http请求相关总结
Mar 31 #NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 #NodeJs
nodejs微信开发之自动回复的实现
Mar 17 #NodeJs
You might like
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
拖拉表格的JS函数
2008/11/20 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Python super()函数使用及多重继承
2020/05/06 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
大学生应聘自荐信
2013/10/11 职场文书
体育馆的标语
2014/06/24 职场文书
119消防日活动总结
2014/08/29 职场文书
最美家庭活动方案
2014/08/31 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android