如何使 IIS 始终预压缩/pregzip 某个文件?

如何使 IIS 始终预压缩/pregzip 某个文件?

我有一个 4mb 的 js 文件(gzip 压缩版本为 900kb)。该文件如下:main.328479fdsdf.js(因此它有一个基于内容的哈希值)。

IIS 似乎只有在 10 秒内访问 2 次时才会压缩我的大 js 文件。但是,如果我每隔 1 分钟就有一个用户使用 3G,他将不得不等待大约 30 秒才能打开网站。如果是 GZIPPED,用户只需等待 12 秒。

我知道 GZIP 不适用于所有内容,但对于我的特定文件,我需要始终通过网络压缩发送。我该如何实现?

答案1

我找到了一个解决方法。我觉得这是一个比较粗暴的解决方案,但它解决了我的问题。

我的想法是创建一个 Windows 服务,每隔几秒钟发出一次请求,以确保 IIS 始终将我的 JavaScript 文件视为频繁访问,并始终拥有它们的压缩版本:

class JsScriptCompressKeeper
{
    private bool keepRunning = true;
    public void Start()
    {
        var thread = new Thread(Run);
        thread.Start();
    }

    public void Stop()
    {
        keepRunning = false;
    }


    public void Run()
    {
        var mainUrl = "www.example.com";
        var pingTimeout = 7;  //seconds
        // my js filenames are like babel-polyfill.asd123eqwed.js and main.113edweq.js 
        var patterns = new[] { @"babel-polyfill.([A-Za-z0-9\-]+).js", @"main.([A-Za-z0-9\-]+).js"};

        using (var client = new WebClient())
        {
            // parse the HTML and find my JS files
            var mainHtml = client.DownloadString(new Uri(mainUrl));
            var urls = patterns.Select(pattern =>
            {
                var match = Regex.Match(mainHtml, pattern);
                var fileName = match.Groups[0].Value;
                return new Uri($"{mainUrl}/{fileName}");
            }).ToList();

            while (true)
            {
                if (!keepRunning)
                {
                    break;
                }

                Thread.Sleep(TimeSpan.FromSeconds(pingTimeout));
                urls.ForEach(url =>
                {
                    client.DownloadString(url);
                });
            }
        }

    }
}

PS 我觉得我的解决方案太老套了,所以我不会接受我的答案。也许其他人有更干净的解决方案!:)

相关内容