最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用nodejs分離html文件里的js和css詳解

 更新時(shí)間:2019年04月12日 08:41:46   投稿:laozhang  
在本篇文章里小編給大家分享了關(guān)于如何使用nodejs分離html文件里的js和css的相關(guān)知識(shí)點(diǎn),需要的朋友參考下。

摘要: 本文要實(shí)現(xiàn)的內(nèi)容,使用nodejs 對(duì)文件的增刪改查,演示的例子-》分離出一個(gè)html 文件里面的script 和style 里面的內(nèi)容,然后單獨(dú)生成js文件和css 文件。中間處理異步的api-》async/await , Promise

項(xiàng)目托管: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 內(nèi)容

/**

 * 

 */

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

/**

 * 向文件中追加內(nèi)容

 * @param {是文件名字} path 

 * @param {寫入文件的內(nèi)容} 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}數(shù)據(jù)已追加到文件`);

      resolve()

    });

  })

}

// 寫一個(gè)html

const writeHtml = (path, data) => {

  return new Promise(resolve => {

    fs.writeFile(path, data, (err) =>{

      if(err) {

        console.log('err', err)

        return

      }

      console.log(`${path} 寫入成功,功能結(jié)束!`);

      resolve() // 必須resolve 。不然 promise 就到此為止,調(diào)用該方法后面的代碼將不執(zhí)行

    })

  })

}

 

// 插件 方法入口

(async ()=>{

  console.log('==========================game-start=============================');

  await deleteDir('./test');

  console.log('我應(yīng)該是等---刪除文件夾后---才出現(xiàn)')

 

  await mkdirTest();

  console.log('我應(yīng)該是在---文件夾新建成功---后出現(xiàn)!');

 

  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('我應(yīng)該是在---css寫入成功---后出現(xiàn)!');

 

  await appendFile('./test/test.js', JSON.parse(jsContent), 'js');

  console.log('我應(yīng)該是在---js寫入成功---后出現(xiàn)!');

 

  htmlContentStr = originContent

  .replace(allStyleReg, '')

  .replace(cssReg, cssLink)

  .replace(allScriptReg, '')

  .replace(jsReg, jsrc);

  console.log('copyTest.html 文本已經(jīng)格式化,準(zhǔn)備寫入');

  await writeHtml('./test/copyTest.html', htmlContentStr);

 

  console.log('==========================game-over=============================');

})()

代碼確實(shí)沒(méi)什么好解釋的,慢慢看就明白了。運(yùn)行:

node extract-js-css

如果你要使用 es6 module,用 import 導(dǎo)入方法,需要單獨(dú)裝一個(gè)babel,使用這個(gè)包去編譯成es5,在運(yùn)行,具體使用可以down項(xiàng)目運(yùn)行一下。

針對(duì)此項(xiàng)目,需要提醒說(shuō)明以下:

對(duì)文件的處理都是異步操作,如果是單一的一個(gè)異步操作方法(比如:appendFile 方法),它就是往文件里面異步添加內(nèi)容,直接封裝成一個(gè)promise,然后 return 出來(lái)就好。

如果一個(gè)操作里面包含多個(gè)異步處理邏輯的就需要在這個(gè)方法里面,用async 聲明方法,用await 等待異步操作,最后return 出去一個(gè)promise

在執(zhí)行主流程中,我們用async聲明的方法進(jìn)行調(diào)用(我這里是匿名函數(shù)直接調(diào)用) ,用await 進(jìn)行等待異步操作,這樣我們的主流程就是一個(gè)同步的執(zhí)行的流程,看起來(lái)很爽朗。

文中的異步操作文件的api 方法是異步的,nodejs 開(kāi)發(fā)文檔提供了同步操作文檔,大家可以直接使用同步的api。我這里主要是聯(lián)系在異步操作的過(guò)程中,使用async/ await promise 方法,更好的掌握它。

文中的一個(gè)demo 提供了處理多個(gè)異步、一個(gè)異步操作里面包含多個(gè)異步操作,包括在循環(huán)里執(zhí)行異步操作 的一個(gè)方案,里面具體針對(duì)HTML 文件的字符串處理,比較搓搓,在用正則匹配和字符串格式化和解析字符串的情況比較單一。在讀取完文件內(nèi)容后,需要 JSON.stringify,后來(lái)在填入文件中的時(shí)候要 JSON.parse , 目前沒(méi)找到合適的方法,如果有大佬有合適的方法,歡迎告知與我,大家一起交流。

下面是 執(zhí)行一個(gè)主 async方法的一個(gè)過(guò)程

相關(guān)文章

  • Google官方支持的NodeJS訪問(wèn)API,提供后臺(tái)登錄授權(quán)

    Google官方支持的NodeJS訪問(wèn)API,提供后臺(tái)登錄授權(quán)

    Google官方支持的NodeJS集成客戶端,用以訪問(wèn)Google APIs, 支持OAuth 2.0授信及登錄認(rèn)證。登錄以后即可在后臺(tái)訪問(wèn)例如 Google Drive(云存儲(chǔ)), Google Analytics, Gmail等服務(wù)。
    2014-07-07
  • 詳解NODEJS基于FFMPEG視頻推流測(cè)試

    詳解NODEJS基于FFMPEG視頻推流測(cè)試

    本篇文章主要介紹了詳解NODEJS基于FFMPEG視頻推流測(cè)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • node運(yùn)行服務(wù)無(wú)響應(yīng)的解決

    node運(yùn)行服務(wù)無(wú)響應(yīng)的解決

    這篇文章主要介紹了node運(yùn)行服務(wù)無(wú)響應(yīng)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于uni-app和Node.js實(shí)現(xiàn)app更新功能

    基于uni-app和Node.js實(shí)現(xiàn)app更新功能

    uniapp 打包 ios,android 之后,有時(shí)候緊急修復(fù)或修改 ui,還需要走應(yīng)用市場(chǎng)審核,往往審核時(shí)間就需要幾天,如果是有bug需要升級(jí)就會(huì)很著急,要在uni-app中實(shí)現(xiàn)app更新功能,并使用Node.js作為后端服務(wù)本文給出了詳細(xì)的思路和步驟,需要的朋友可以參考下
    2024-08-08
  • node vue項(xiàng)目開(kāi)發(fā)之前后端分離實(shí)戰(zhàn)記錄

    node vue項(xiàng)目開(kāi)發(fā)之前后端分離實(shí)戰(zhàn)記錄

    其實(shí)基于vue.js+node.js構(gòu)建的開(kāi)源博客系統(tǒng)有很多,下面這篇文章主要給大家介紹了關(guān)于node vue項(xiàng)目開(kāi)發(fā)之前后端分離的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-12-12
  • nodejs實(shí)現(xiàn)jwt的示例代碼

    nodejs實(shí)現(xiàn)jwt的示例代碼

    本文主要介紹了nodejs實(shí)現(xiàn)jwt的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • node檢測(cè)端口可用性的實(shí)踐示例

    node檢測(cè)端口可用性的實(shí)踐示例

    本文主要介紹了node檢測(cè)端口可用性的實(shí)踐示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Node.js如何提取文件中的中文字符

    Node.js如何提取文件中的中文字符

    這篇文章主要介紹了Node.js如何提取文件中的中文字符,本文介紹了在Node.js開(kāi)發(fā)中如何使用代碼提取文件中的中文字符,幫助開(kāi)發(fā)者更好地處理中文文本數(shù)據(jù),提高開(kāi)發(fā)效率
    2023-05-05
  • 配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解

    配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解

    這篇文章主要介紹了配置node服務(wù)器并且鏈接微信公眾號(hào)接口配置步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • NPM相關(guān)命令之報(bào)錯(cuò)node-gyp...的解決方法

    NPM相關(guān)命令之報(bào)錯(cuò)node-gyp...的解決方法

    node-gyp就是為node編譯c++擴(kuò)展的時(shí)候使用的編譯工具,下面這篇文章主要給大家介紹了關(guān)于NPM相關(guān)命令之報(bào)錯(cuò)node-gyp...的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論

丰县| 庆云县| 桓仁| 嘉鱼县| 安吉县| 东乌珠穆沁旗| 萝北县| 南充市| 德江县| 哈尔滨市| 米易县| 介休市| 涟水县| 沁水县| 青冈县| 龙山县| 沈丘县| 招远市| 白河县| 上林县| 奉贤区| 西贡区| 肥城市| 木里| 开封县| 霍林郭勒市| 铜山县| 会东县| 当雄县| 阿拉尔市| 新泰市| 寿光市| 深泽县| 阿克苏市| 呼和浩特市| 永定县| 安阳县| 民县| 台北市| 莱西市| 尤溪县|