javascript - 将 HTML 文件中的 JavaScript 转换为 ES5
问题描述
我有一个 HTML 文档,其中包含大量脚本标记中的内联 JavaScript,以及其他元素的属性(onload、onclick 等)。我需要使该文件在仅支持 ES5 的环境中工作。然而,JavaScript 使用了许多仅在 ES6 及更高版本中可用的新功能。
必须使用 node.js 脚本来触发转译(顺便说一句,该脚本首先负责生成 HTML 文件)。
我真的想不出这样做的好方法。
我的第一个想法是:
- 使用cheerio 遍历所有脚本标签
- 使用 babel 转译每个标签的 innerHTML
- 将转译后的 html 写回原始脚本标签
这很好用,但它完全忽略了 JavaScript 的onclick
属性等,并且可能会创建大量冗余代码,因为转译器一次只知道一小部分代码。
简化示例:
// npm i cheerio @babel/core @babel/preset-env
const babel = require("@babel/core")
const cheerio = require("cheerio")
const generatedHtml = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title of the document</title>
</head>
<body>
<input type="number" id="input1" value="2"></input>
to the power of
<input type="number" id="input2" value="6"></input>
=
<input type="number" id="result"></input> <br />
<button onclick="(()=>{document.getElementById('result').value = power(document.getElementById('input1'), document.getElementById('input2'))})()">Calculate</button>
<script>
const power = (a,b) => a.value**b.value
</script>
<script>
(async()=>"Hello World")().then(console.log)
</script>
</body>
</html>
`;
(async()=>{
const $ = cheerio.load(generatedHtml)
for (const el of $('script').get()) {
const originalCode = $(el).html()
const transpiledCode = (await babel.transformAsync(originalCode, { presets: ["@babel/preset-env"] })).code
$(el).html(transpiledCode)
}
const transpiledHtml = $.html()
console.log(transpiledHtml)
})().catch(console.error)
解决方案
推荐阅读
- multithreading - Spring @Async 失败并拒绝执行异常
- python - 如何使用 os 模块(Windows)以管理员身份运行 exe?
- kubernetes - pod PreStop hook 挂在 Terminating 状态,只有在 terminateGracePeriodSeconds 之后才被杀死
- java - java - 如何将textview中脚本bash的输出显示为java中的列表?
- python - 有没有一种简单的方法可以使用 python 从网站上刮掉一张桌子(按下按钮后)?
- c - 我可以使用“MAX”宏来检查是否所有位都已设置?
- c++ - 头文件 (C++) 中的更改会被忽略吗?
- python - 用破折号下拉过滤 pd.DataFrame
- swift - SwiftUI/UIKit Introspection 在 iOS 14 上被破坏
- node.js - DocuSign 获取 JWT 令牌 MEAN Stack