我最近遇到了一个类似的要求,即跨多个文件运行cleancss。最终选择了类似于 cmets 中讨论的解决方案,即使用 clean-css-api 和实用程序 node.js。
npm 脚本
"scripts": {
"cleancss": "glob \"public/css/**/*.css\" | node .scripts/cleancss.js"
},
注意cli-glob(添加到package.json)的初始用途是在将路径传送到cleancss.js之前获取路径。
cleancss.js
实用节点脚本如下(虽然相当简陋!):
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var readline = require('readline');
var CleanCSS = require('clean-css');
var mkdirp = require('mkdirp');
var rl = readline.createInterface({
input: process.stdin,
output: null,
terminal: false
});
var options = {
// ... https://www.npmjs.com/package/clean-css#constructor-options
// ... https://www.npmjs.com/package/clean-css#formatting-options
};
function saveFile(outputPath, minified) {
fs.writeFile(outputPath, minified, function(err) {
if (err) {
return console.log(err);
}
});
}
function pathParts(srcPath) {
var ext = path.extname(srcPath),
name = path.basename(srcPath, ext),
dirPath = path.dirname(srcPath),
pathParts = dirPath.split(path.sep),
pathNoRoot;
pathParts.shift();
pathNoRoot = pathParts.join(path.sep);
return {
ext: ext,
name: name,
pathNoRoot: pathNoRoot
};
}
function minify(srcPath, outputPath) {
var output = new CleanCSS(options).minify([srcPath]);
saveFile(outputPath, output.styles);
}
function processPath(srcPath) {
var outDir = process.env.npm_package_config_css_outdir || path.dirname(srcPath),
p = pathParts(srcPath),
newName = p.name + '.min' + p.ext,
mkDirPath,
outputPath;
if (process.env.npm_package_config_css_outdir) {
mkDirPath = outDir + path.sep + p.pathNoRoot + path.sep;
mkdirp(mkDirPath, function() {
outputPath = mkDirPath + newName;
minify(srcPath, outputPath);
});
} else {
outputPath = outDir + path.sep + newName;
minify(srcPath, outputPath);
}
}
rl.on('line', function(srcPath) {
processPath(srcPath);
});
附加信息
- 默认情况下,
.min.css 文件输出到与.css 源文件相同的路径。
- 但是,如果您需要更改输出目标,则可以使用
package.json 中的config 对象。以下示例会将所有.css.min 输出到./dist/ 路径:
"config": {
"css_outdir": "./dist"
},
"scripts": {
"cleancss": "glob \"public/css/**/*.css\" | node .scripts/cleancss.js"
},
-
cleancss.js 在使用config.css_outdir 时利用mkdirp 复制/镜像目标文件夹中的.css 源路径/子文件夹。