溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用nodejs分離html文件里的js和css

發(fā)布時間:2021-08-03 09:48:44 來源:億速云 閱讀:166 作者:小新 欄目:web開發(fā)

這篇文章主要介紹如何使用nodejs分離html文件里的js和css,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

摘要: 本文要實(shí)現(xiàn)的內(nèi)容,使用nodejs 對文件的增刪改查,演示的例子-》分離出一個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()

    });

  })

}

// 寫一個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í)沒什么好解釋的,慢慢看就明白了。運(yùn)行:

node extract-js-css

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

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

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

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

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

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

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

如何使用nodejs分離html文件里的js和css

以上是“如何使用nodejs分離html文件里的js和css”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI