/*
* This is the main entry point for defining npm tasks
* Author: *****
* Date: 06/03/2019
*/
const del = require('del');
var Uglify = require("uglify-js"),
fs = require('fs'),
async = require('async'),
path = require('path'),
rename = require('rename'),
parentDir = 'Scripts';
Проверка типа сборки (Release, Production, Debug и т. Д.) Выполняется с использованием узла, поэтому в этой части сценария не было никаких изменений.
// set a variable telling us if we're building in release
var isRelease = true;
if (process.env.NODE_ENV && process.env.NODE_ENV !== 'release') {
isRelease = false;
}
console.log(process.env.NODE_ENV);
Какдля модуля npm del я выбрал синхронный метод.Причина в том, что я хотел, чтобы каждый файл обрабатывался отдельно, а не параллельно.В асинхронном методе отсутствовал файл .acingore, и в любом случае не так много файлов, которые нужно удалять
// Returns an array of deleted paths
const deletedPaths = del.sync(['Scripts/*.min.js', 'Scripts/Maps/*.map', 'Scripts/.acignore']);
console.log('Deleted files and folders:\n', deletedPaths.join('\n'));
Этот блок выполняет всю работу.Эта функция запускает массив функций последовательно, каждая из которых передает свои результаты следующему в массиве.После завершения каждой функции передается обратный вызов.
async.waterfall([
function (cb) {
fs.readdir(parentDir, cb);
},
function (files, cb) {
// files is just an array of file names, not full path
console.log('Files being looped through:\n');
// run 10 files in parallel
async.eachLimit(files, 10, function (filename, done) {
var filePath = path.join(parentDir, filename);
var sourceFile = filename;
if (!fs.lstatSync(filePath).isDirectory()) {
// create a .temp file to be minified
fs.copyFileSync(filePath, filePath + '.temp', (err) => {
if (err) throw err;
// console.log(filePath + ' was copied to ' + filePath + '.temp');
});
// path the .temp file
var tempfilePath = path.join(parentDir, filename + '.temp');
// console.log('tempfilePath: ' + tempfilePath);
// check for /Maps directory, if not, create it
var mapsDir = parentDir + '/Maps';
try {
if (!fs.existsSync(mapsDir)) {
fs.mkdirSync(mapsDir)
}
} catch (err) {
console.error(err)
}
// rename file to add .min suffix for minified files
filename = rename(filename, { suffix: '.min' });
// console.log('filename after rename\n' + filename + '\n');
var newfilePath = path.join(parentDir, filename);
// console.log('filePath after rename\n' + newfilePath + '\n');
// Synchronous rename
fs.renameSync(tempfilePath, newfilePath);
// get contents of sourceFile
// The source file must be interpolated with [] in order
// to be mapped correctly, otherwise your map will get the content
// of the source file but not have a link back to the source
try {
var code = {
[sourceFile]: fs.readFileSync(filePath, 'utf-8')
};
console.log(code);
} catch (e) {
console.log('Error:', e.stack);
}
// minify file
// the syntax for uglifyjs minify is minify(code, options)
// therefore you need the contents of the file in order to minify it
// and source map it
var uglyCode = Uglify.minify(code,
{
mangle: isRelease,
sourceMap: {
includeSources: false,
filename: '../' + filename,
root: '../',
url: 'Maps/' + filename,
},
}
);
// console.log('Source file: ' + sourceFile);
// write minified file to directory
fs.writeFile(newfilePath, uglyCode.code, function (err) {
if (err) {
console.log(err);
} else {
console.log(filename + " has been mangled");
}
}
);
// write map file to directory
fs.writeFile(mapsDir + '/' + filename + '.map', uglyCode.map, function (err) {
if (err) {
console.log(err);
} else {
console.log(filename + '.map' + " has been mapped");
}
}
);
done();
}
}, cb);
}
], function (err) {
err && console.trace(err);
console.log('\nNo more files in path\n');
});
SIDE ПРИМЕЧАНИЕ. Если вы работаете с узлом 10+ и не можете указать путь к npm в файле .csproj, установите узел глобально, и вы неТ нужно установить путь.
Надеюсь, мои комментарии в коде достаточны.Удачи, если вы пытаетесь отойти от gulp и перейти на npm!