From 4ac1e7a3e6cabd0f5b9b7385cd932dfbc2d7b495 Mon Sep 17 00:00:00 2001 From: Mervin Date: Sun, 3 Dec 2023 22:13:31 +0800 Subject: [PATCH] perf(core): Extract default configuration & Sass default configuration --- packages/core/base/defaults.js | 36 ++++++++++++++++++++++++++++++++++ packages/core/build/html.js | 13 ++---------- packages/core/build/style.js | 6 ++++-- 3 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 packages/core/base/defaults.js diff --git a/packages/core/base/defaults.js b/packages/core/base/defaults.js new file mode 100644 index 0000000..c964c62 --- /dev/null +++ b/packages/core/base/defaults.js @@ -0,0 +1,36 @@ +const htmlMinifyOptions = { + collapseWhitespace: true, //移除多余空白 + removeComments: true, //移除注释 + // removeRedundantAttributes: true, //移除默认值的属性 + removeEmptyAttributes: true, //移除空的属性 + // removeAttributeQuotes: true, //移除属性值周围的引号,仅在可能的情况下使用 + collapseBooleanAttributes: true, //当属性值为布尔类型时,移除属性值,仅保留属性名称 + minifyJS: true, //使用terser来压缩内联JavaScript代码 + minifyCSS: true //使用clean-css压缩内联CSS代码 +} + +// !警告: sass@2.x以后该配置无效 +const sassDefaultOptions = { + includePaths: ['node_modules'], //支持加载npm包 + importer: [ + // 支持以 `~` 开头的 npm包 + function (url, prev, done) { + url = url.startsWith('~') ? url.substr(1) : url; + if (typeof done === 'function') { + done({ file: url }) + } else { + return { file: url } + } + } + ], + importers: [ + { + findFileUrl: url => findUrlFromNpm(url, '~') + } + ] +} + +module.exports = { + htmlMinifyOptions, + sassDefaultOptions +} diff --git a/packages/core/build/html.js b/packages/core/build/html.js index 11724fb..45ac58e 100644 --- a/packages/core/build/html.js +++ b/packages/core/build/html.js @@ -16,6 +16,7 @@ const { } = require('@pipflow/utils') const { pipeline, onDone } = require('../base/utils') +const { htmlMinifyOptions } = require('../base/defaults') const { revDir, createSrcOptions, outputFiles, plumber, putProcesses } = require('./comm') /** @@ -110,17 +111,7 @@ module.exports = function htmlTask(options = {}, done) { // 8. 压缩处理 if (htmlMinify) { - const minifyOptions = Object.assign({ - collapseWhitespace: true, //移除多余空白 - removeComments: true, //移除注释 - // removeRedundantAttributes: true, //移除默认值的属性 - removeEmptyAttributes: true, //移除空的属性 - // removeAttributeQuotes: true, //移除属性值周围的引号,仅在可能的情况下使用 - collapseBooleanAttributes: true, //当属性值为布尔类型时,移除属性值,仅保留属性名称 - minifyJS: true, //使用terser来压缩内联JavaScript代码 - minifyCSS: true //使用clean-css压缩内联CSS代码 - }, _.isPlainObject(htmlMinify) ? htmlMinify : {}) - + const minifyOptions = Object.assign({}, htmlMinifyOptions, _.isPlainObject(htmlMinify) ? htmlMinify : {}) processes.push(htmlMinifier(minifyOptions)) } diff --git a/packages/core/build/style.js b/packages/core/build/style.js index ff87516..a55413d 100644 --- a/packages/core/build/style.js +++ b/packages/core/build/style.js @@ -19,6 +19,7 @@ const { } = require('@pipflow/utils') const { pipeline, onDone } = require('../base/utils') +const { sassDefaultOptions } = require('../base/defaults') const { createSrcOptions, outputFiles, @@ -44,7 +45,7 @@ module.exports = function styleTask(options = {}, done) { const srcOptions = createSrcOptions(options) const basePath = getBasePath(input, options.base || '.') //合并文件后的基础路径 const cssFilter = filter('**/*.css', { restore: true }) - + /** * 统一入口方式 (input支持 `string`, `array`, `object`) * 流程分开处理 为了解决合并文件的问题 @@ -84,7 +85,8 @@ module.exports = function styleTask(options = {}, done) { // 5.2 CSS预处理器 if (compiler === 'sass' || compiler === 'scss') { - baseProcesses.push(sass(compilerOptions?.preprocessorOptions || {}).on('error', sass.logError)) + const _sassOptions = Object.assign({}, sassDefaultOptions, compilerOptions?.preprocessorOptions) + baseProcesses.push(sass(_sassOptions).on('error', sass.logError)) } else if (compiler === 'less') { baseProcesses.push(less(compilerOptions?.preprocessorOptions || {})) } else if (compiler === 'stylus') {