public JsMinifier(ILoggerFactory loggerFactory) { if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } _logger = loggerFactory.CreateLogger <CssMinifier>(); _minifier = new CrockfordJsMinifier(); }
private static Dictionary <string, Tuple <string, byte[]> > LoadCache(string basePath, string[] extensions = null) { //put static files minificated in a memory store -> cache var staticFilesStorage = new Dictionary <string, Tuple <string, byte[]> >(); //read all static files and load into mmemory var files = Directory.GetFiles(basePath, "*", SearchOption.AllDirectories).ToList(); if (extensions != null) { files = files.Where(f => extensions.Contains(Path.GetExtension(f))).ToList(); } var minifyJs = new WebMarkupMin.Core.CrockfordJsMinifier(); var minifyCss = new WebMarkupMin.Core.KristensenCssMinifier(); var minifyHtml = new WebMarkupMin.Core.HtmlMinifier(); files.ForEach(file => { var content = File.ReadAllBytes(file); var ext = Path.GetExtension(file); //compress or minify if (Environment.GetEnvironmentVariable("minifyResponse") != "false") { switch (ext) { case ".js": //javascript minify var js = System.Text.UTF8Encoding.Default.GetString(content); var minifiedJs = minifyJs.Minify(js, false); if (!minifiedJs.Errors.Any()) { content = System.Text.UTF8Encoding.Default.GetBytes(minifiedJs.MinifiedContent); } break; case ".css": //css minify var css = System.Text.UTF8Encoding.Default.GetString(content); var minifiedCss = minifyCss.Minify(css, false); if (!minifiedCss.Errors.Any()) { content = System.Text.UTF8Encoding.Default.GetBytes(minifiedCss.MinifiedContent); } break; case ".html": //html minify var html = System.Text.UTF8Encoding.Default.GetString(content); var minifiedHtml = minifyHtml.Minify(html, false); if (!minifiedHtml.Errors.Any()) { content = System.Text.UTF8Encoding.Default.GetBytes(minifiedHtml.MinifiedContent); } break; } } staticFilesStorage.Add(file, new Tuple <string, byte[]>(MimeMapping.MimeUtility.GetMimeMapping(file), content)); }); var usedMemory = Math.Round(staticFilesStorage.Select(s => s.Value).Sum(s => s.Item2.Length) / 1024.0 / 1024.0); Console.WriteLine($"{staticFilesStorage.Count} static files loaded into memory using {usedMemory} MB"); return(staticFilesStorage); }
public static void Run( AbsolutePath scriptsDirectory, AbsolutePath componentsDirectory, string bundleFileName) { var componentsFolderPath = componentsDirectory; var componentsPathForBundle = GetRelativePath(scriptsDirectory, componentsDirectory).Replace('\\', '/').Trim('/'); var componentsFolder = new DirectoryInfo(componentsFolderPath); var jsMinifier = new WebMarkupMin.Core.CrockfordJsMinifier(); var htmlMinifier = new WebMarkupMin.Core.HtmlMinifier(jsMinifier: jsMinifier); var bundleParts = componentsFolder.EnumerateDirectories().SelectMany(x => x.EnumerateFiles().Select(y => { var name = y.Name.Replace(y.Extension, string.Empty); var path = string.Empty; var contentType = ContentType.Unknown; var content = string.Empty; if (string.Equals(y.Extension, ".js", StringComparison.InvariantCultureIgnoreCase)) { path = $"{componentsPathForBundle}/{x.Name}/{name}"; contentType = ContentType.Js; } else if (string.Equals(y.Extension, ".html", StringComparison.InvariantCultureIgnoreCase)) { path = $"text!{componentsPathForBundle}/{x.Name}/{y.Name}"; contentType = ContentType.Html; } else { return(ContentType: contentType, ModuleName: x.Name, ContentPath: y.FullName, Content: string.Empty); } using (var stream = File.OpenRead(y.FullName)) using (var reader = new StreamReader(stream)) { content = reader.ReadToEnd(); switch (contentType) { case ContentType.Js: content = jsMinifier.Minify(content, false).MinifiedContent; break; case ContentType.Html: content = htmlMinifier.Minify(content).MinifiedContent.Replace("\r", "").Replace("\n", "").Replace("\'", "\\'"); break; default: break; } } return(ContentType: contentType, ModuleName: x.Name, ContentPath: path.Replace("\\", "/"), Content: content); })).ToList(); var part1 = string.Join(string.Empty, bundleParts.SelectMany(x => x.ContentType == ContentType.Html ? new[] { $"define('{x.ContentPath}', [], function () {{ return '{x.Content}';}});" } : new string[] { })); var part2 = string.Join(string.Empty, bundleParts.SelectMany(x => x.ContentType == ContentType.Js ? new[] { x.Content } : new string[] { })); var moduleDescriptions = bundleParts.GroupBy(x => x.ModuleName); var part3 = $"define('components', [{string.Join(",", moduleDescriptions.Select(x => "'" + x.Key + "'"))}]);"; var part4 = string.Join(string.Empty, moduleDescriptions.Select(x => $"define('{x.Key}', [{string.Join(",", x.Select(y => "'" + y.ContentPath + "'"))}]);")); using (var stream = File.Create(componentsFolderPath / bundleFileName)) using (var writer = new StreamWriter(stream)) { writer.Write(string.Join(Environment.NewLine, new[] { part1, part2, part3, part4 })); } Console.WriteLine("Bundle assembled!"); }