【问题标题】:How to use Intl.js as es2015 modules in rollup.js build如何在 rollup.js 构建中使用 Intl.js 作为 es2015 模块
【发布时间】:2017-02-17 17:08:54
【问题描述】:

我在typescript 2 中编码的Angular 2 应用程序使用the Intl.js polyfill

我在tsconfig.json 中设置了module:"es2015",以允许使用Rollup.js 作为recommended by Angular 进行树摇动。在我的组件中,我只是做import 'intl'

当我在浏览器中运行应用程序时,我得到了错误

全局未定义

我尝试使用rollup-plugin-commonjs 将库转换为es2015

rollup.config.js

plugins: [
        nodeResolve({jsnext: true, module: true}),
        commonjs({
            include: 'node_modules/intl/**/*',
        })
]

当我在浏览器中运行应用程序时,出现错误:

IntlPolyfill 未定义

在线:

IntlPolyfill.__addLocaleData({locale:"en-US",...});

I noticed here 表示该库是用es6 编写的,因此它应该与rollup 兼容。关于如何将此库用作es6 模块的任何提示?

【问题讨论】:

    标签: angular module bundling-and-minification rollupjs


    【解决方案1】:

    要将 Intl.js 用作 ES6 模块,您需要

    1. 使用package.json 中的modulejsnext:main 字段,说服维护人员将ES 模块版本与dist 文件夹中的其他文件(例如Intl.esm.js 等)一起发布——他们是已经使用 Rollup 来生成他们的 UMD 构建,所以这将是一个微不足道的添加,或者
    2. 自己构建,使用 src 中的文件,注意使用相同的 Babel 配置等。

    但是您可以使用 rollup-plugin-commonjs 以当前形式使用它。事实证明,您只需要确保导入的是 dist/Intl.js 文件而不是 index.js 文件(可能是由于一些棘手的循环依赖关系,它们在 CommonJS 中的工作方式与它们在 ES 模块中的工作方式不同):

    import 'intl/dist/Intl.js';
    console.log(Intl); // works!
    

    这将比导入 index.js 产生更好的结果,即使它有效,因为 dist 文件是直接从 ES 模块生成的(没有臃肿的 CommonJS 转换)。

    【讨论】:

    • 一个问题是我只使用en-us 语言环境,所以我编辑了intl/index.js 并将第6 行从this 更改为this。这使我能够大大减少捆绑包的大小。您的解决方案能否进行调整以保持您认为的这种优势?
    • 一种方法是使用rollup-plugin-replacelocale-data/complete.js 替换为locale-data/jsonp/es-US.js
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2017-01-13
    • 2017-02-09
    • 2015-02-25
    • 2021-12-30
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多