const glob = require('glob'); const path = require('path'); const fs = require('fs'); const cheerio = require('cheerio'); const sass = require('sass'); const args = process.argv.slice(2); let partten = "**/*.htmv"; if (args[1]) { partten = args[1]; } let dirPath = args[0] || './src'; /** * * @param {String} dirPath * @param {String} partten */ function dealVueStyleNode(dirPath, partten) { const files = glob.globSync(partten, { cwd: dirPath }); files.forEach(file => dealVueStyleNodeSingleFile(path.resolve(dirPath, file))); } function dealVueStyleNodeSingleFile(file) { const html = fs.readFileSync(file, 'utf-8'); // 使用 cheerio 加载 HTML 文档 // 第三个参数表示不加载到document中 const $ = cheerio.load(html, { lowerCaseTags: false, xmlMode: true, normalizeWhitespace: false, decodeEntities: false, }, false); // 修改 HTML 文档中的内容 $('style').each((index, styleEl) => { styleEl = $(styleEl); const lang = styleEl.attr('lang'); if (!lang || lang == 'scss') { const scssString = styleEl.text(); try { const result = parseScss(scssString, file); styleEl.text(result.css); console.log(`file: ${file} style-node: ${index} deal style success.`); } catch (e) { console.warn(`file: ${file} style-node: ${index} deal style error.`, e); } styleEl.attr('lang', 'css'); } }) if ($('style').length) { fs.writeFileSync(file, $.html()); } // // 将修改后的 HTML 文档写入文件 // fs.writeFileSync('index.html', $.html()); } function parseScss(scssString, file) { const result = sass.compileString(scssString, { url: file }); return result; } dealVueStyleNode(dirPath, partten);