Do not minify non-JS script data
This commit is contained in:
parent
9a26aaa493
commit
9627921cb2
|
@ -42,7 +42,7 @@ Since speed depends on the input, speed charts show performance relative to the
|
|||
The settings used for each minifier can be found in [minifiers.js](./minifiers.js). Some settings to note:
|
||||
|
||||
- CSS minification is disabled for all, as minify-html currently does not support CSS minification (coming soon).
|
||||
- To increase fairness, all minifiers use esbuild for JS minification, and do so asynchronously and in parallel, similar to how minify-html works.
|
||||
- All minifiers are configured to use esbuild for JS minification asynchronously and in parallel, similar to how minify-html works.
|
||||
- `conservativeCollapse` is enabled for html-minifier as otherwise some whitespace would be unsafely removed with side affects. minify-html can safely remove whitespace with context if configured properly.
|
||||
|
||||
## Running
|
||||
|
|
|
@ -168,6 +168,7 @@ fn test_script_type_attr_value_removal() {
|
|||
eval(b"<script type=\"application/ecmascript\"></script>", b"<script></script>");
|
||||
eval(b"<script type=\"application/javascript\"></script>", b"<script></script>");
|
||||
eval(b"<script type=\"text/jscript\"></script>", b"<script></script>");
|
||||
eval(b"<script type=\"text/plain\"></script>", b"<script type=text/plain></script>");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -304,4 +305,5 @@ fn test_js_minification() {
|
|||
<script>let a = 1;</script>
|
||||
<script>let b = 2;</script>
|
||||
"#, b"<script>let a=1;</script><script>let b=2;</script>");
|
||||
eval_with_js_min(b"<script type=text/plain> alert(1.00000); </script>", b"<script type=text/plain> alert(1.00000); </script>");
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ lazy_static! {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn process_script(proc: &mut Processor, cfg: &Cfg) -> ProcessingResult<()> {
|
||||
pub fn process_script(proc: &mut Processor, cfg: &Cfg, js: bool) -> ProcessingResult<()> {
|
||||
#[cfg(feature = "js-esbuild")]
|
||||
let start = Checkpoint::new(proc);
|
||||
loop {
|
||||
|
@ -35,7 +35,7 @@ pub fn process_script(proc: &mut Processor, cfg: &Cfg) -> ProcessingResult<()> {
|
|||
// `process_tag` will require closing tag.
|
||||
if proc.m(IsSeq(b"</script"), MatchOnly).nonempty() {
|
||||
#[cfg(feature = "js-esbuild")]
|
||||
if cfg.minify_js {
|
||||
if js && cfg.minify_js {
|
||||
let (wg, results) = proc.new_script_section();
|
||||
let src = start.written_range(proc);
|
||||
// TODO Optimise: Avoid copying to new Vec.
|
||||
|
|
|
@ -42,7 +42,8 @@ lazy_static! {
|
|||
|
||||
#[derive(Copy, Clone)]
|
||||
enum TagType {
|
||||
Script,
|
||||
ScriptJs,
|
||||
ScriptData,
|
||||
Style,
|
||||
Other,
|
||||
}
|
||||
|
@ -110,8 +111,9 @@ pub fn process_tag(proc: &mut Processor, cfg: &Cfg, ns: Namespace, mut prev_sibl
|
|||
// Write previously skipped name and use written code as range (otherwise source code will eventually be overwritten).
|
||||
let tag_name = proc.write_range(source_tag_name);
|
||||
|
||||
let tag_type = match &proc[tag_name] {
|
||||
b"script" => TagType::Script,
|
||||
let mut tag_type = match &proc[tag_name] {
|
||||
// Unless non-JS MIME `type` is provided, `script` tags contain JS.
|
||||
b"script" => TagType::ScriptJs,
|
||||
b"style" => TagType::Style,
|
||||
_ => TagType::Other,
|
||||
};
|
||||
|
@ -153,13 +155,17 @@ pub fn process_tag(proc: &mut Processor, cfg: &Cfg, ns: Namespace, mut prev_sibl
|
|||
|
||||
let ProcessedAttr { name, typ, value } = process_attr(proc, ns, tag_name)?;
|
||||
match (tag_type, &proc[name]) {
|
||||
(TagType::Script, b"type") => {
|
||||
// NOTE: We don't support multiple `type` attributes, so can't go from ScriptData => ScriptJs.
|
||||
(TagType::ScriptJs, b"type") => {
|
||||
// It's JS if the value is empty or one of `JAVASCRIPT_MIME_TYPES`.
|
||||
let script_tag_type_is_js = value
|
||||
.filter(|v| !JAVASCRIPT_MIME_TYPES.contains(&proc[*v]))
|
||||
.is_none();
|
||||
if script_tag_type_is_js {
|
||||
erase_attr = true;
|
||||
} else {
|
||||
// Tag does not contain JS, don't minify JS.
|
||||
tag_type = TagType::ScriptData;
|
||||
};
|
||||
}
|
||||
(_, name) => {
|
||||
|
@ -203,7 +209,8 @@ pub fn process_tag(proc: &mut Processor, cfg: &Cfg, ns: Namespace, mut prev_sibl
|
|||
};
|
||||
|
||||
match tag_type {
|
||||
TagType::Script => process_script(proc, cfg)?,
|
||||
TagType::ScriptData => process_script(proc, cfg, false)?,
|
||||
TagType::ScriptJs => process_script(proc, cfg, true)?,
|
||||
TagType::Style => process_style(proc)?,
|
||||
_ => process_content(proc, cfg, child_ns, Some(tag_name))?,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue