【问题标题】:Intl.js polyfill/shim with webpack?带有 webpack 的 Intl.js polyfill/shim?
【发布时间】:2015-06-30 12:53:36
【问题描述】:

我正在使用 React-Intlwebpack,我需要 Intl shim 来支持 Safari 和 IE,但我不想为已经支持 Intl spec 的浏览器加载它。

polyfill 非常大(900kb),我如何确保它只在不支持它的浏览器中加载?

【问题讨论】:

    标签: javascript reactjs webpack polyfills


    【解决方案1】:

    您需要做一些事情。

    1. 确保要求 intl/Intl 加载核心库而不是所有相关国家。这会将库的大小从大约 900kb 减少到大约 150kb。

    2. 仅在需要时使用 webpack 的 require.ensurerequire([]) 函数动态地请求 Intl.js。这将为仅 Intl.js 文件创建一个单独的包,该包将根据需要加载。

    lib/shim.js

    // shim for Intl needs to be loaded dynamically
    // so we callback when we're done to represent
    // some kind of "shimReady" event
    module.exports = function(callback) {
        if (!window.Intl) {
            require(['intl/Intl'], function(Intl) {
                window.Intl = Intl;
                callback();
            });
        } else {
            setTimeout(callback, 0); // force async
        }
    };
    

    app.js

    var shimReady = require('lib/shim');
    shimReady(startApp);
    

    注意:可能还需要访问特定国家/地区的信息和属性。对于我的基本需求,我实际上并不需要这些数据,但如果你确实需要阅读 Intl.js 网站 loading locale data 上的部分。

    【讨论】:

      【解决方案2】:

      一个简单的(非 webpack)方法是在你的 HTML 中做这样的事情:

      <script>
       if (!window.Intl) { document.write('<script src="/js/Intl.min.js"><\/script>'); }
      </script>
      

      虽然document.write 不被认为是最佳实践,但这将提供一种解决问题的阻塞方法,从而大大减少应用程序中的代码。这个解决方案没有使用 webpack,但是对于这种情况下的很多人来说可能是一个合适的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-28
        • 2011-07-17
        • 1970-01-01
        • 2023-03-09
        • 2019-08-20
        • 2022-10-17
        • 2018-12-27
        • 2021-09-20
        相关资源
        最近更新 更多