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实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
在nodejs中创建child process的方法
Jan 26 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
python实现的多线程端口扫描功能示例
2017/01/21 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
施工资料员的岗位职责
2013/12/22 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
未婚证明范本
2015/06/15 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
JavaScript实现两个数组的交集
2022/03/25 Javascript