捆绑前在Javascript中进行搜索和替换

Search and replace in Javascript before bundling

本文关键字:搜索 替换 Javascript      更新时间:2023-09-26

摘要

是否有任何方法可以使ASP.NET MVC应用程序中的绑定和缩小过程在缩小脚本文件之前在脚本文件内执行"搜索和替换"?

背景

我在Javascript文件中定义了一些小部件,其中包含需要翻译成不同语言的单词,具体取决于当前用户的语言。既然javascript文件被MVC缩小为ScriptBundles,那么有可能挂钩到这个构建过程中吗?理想情况下,我们可以使用它来创建本地化的脚本捆绑包,捆绑过程在缩小脚本之前在脚本内部执行搜索/替换。

我希望避免按语言手动创建单独的javascript文件,因为这会使维护变得困难。小部件从客户端字典中提取文本也是如此;我们已经在javascript性能方面遇到了问题,不想再添加一层前端计算。

正如Vladimir所说,您可以创建自己的Bundle转换,只需实现IBundleTransform。我写了一篇关于捆绑和缩小Coffeescriptions的博客文章,可以为你指明正确的方向: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);

你可能需要调整一些事情,但如果它对你有帮助,请告诉我。

实现IBundleTransform接口。示例可以在这里找到。