有没有办法让ASP.NET MVC应用程序中的捆绑和缩小过程在缩小它们之前在脚本文件中执行“搜索和替换”?
我在Javascript文件中定义了一些小部件,这些小部件包含需要翻译成不同语言的单词,具体取决于当前用户的语言。由于MVC将javascript文件缩小为ScriptBundles,是否有可能挂钩到这个构建过程?理想情况下,我们可以使用它来创建本地化的脚本包,捆绑过程在脚本缩小之前在脚本内执行搜索/替换。
我想避免为每种语言手动创建单独的javascript文件,因为这会使其难以维护。对于小部件将从中提取文本的客户端字典也是如此;我们已经遇到了javascript性能问题,并且不想添加另一层前端计算。
答案 0 :(得分:2)
实施IBundleTransform
界面。可以找到示例here。
答案 1 :(得分:2)
正如弗拉基米尔所说,你可以创建自己的Bundle转换,只需实现IBundleTransform
。我写了一篇关于捆绑和缩小Coffeescripts的博客文章,可以指出你正确的方向:http://tallmaris.com/advanced-bundling-and-minification-of-coffeescripts-in-mvc4/
总之,创建一个这样的自定义转换:
public class MultiLanguageBundler : IBundleTransform
{
public void Process(BundleContext context, BundleResponse response)
{
foreach (var file in response.Files)
{
using (var reader = new StreamReader(file.FullName))
{
// "ReplaceLanguageStrings" contains the search/replace logic
compiled += ReplaceLanguageStrings(reader.ReadToEnd());
reader.Close();
}
}
response.Content = compiled;
response.ContentType = "text/javascript";
}
}
然后在BundleConfig
:
var myBundle = new Bundle("~/Scripts/localised")
.Include("~/JsToLocalise/*.js"); //your JS location here, or include one by one if order is important.
myBundle.Transforms.Add(new MultiLanguageBundler());
myBundle.Transforms.Add(new JsMinify());
bundles.Add(myBundle);
您可能需要调整一些内容,但请告诉我它是否对您有帮助。