【问题标题】:How to publish React Component that is a class to NPM without having uglify.js issues?如何在没有 uglify.js 问题的情况下将作为类的 React 组件发布到 NPM?
【发布时间】:2017-06-14 09:42:59
【问题描述】:

我将 ES5 包重写为现代语法以避免弃用警告并将其发布到 npm。

大多数 React 项目,包括基于 next.jscreate-react-app 的项目都使用 uglify.js,它们在 class 关键字处中断。

{ Error: commons.js from UglifyJs
Unexpected token: name
...

如何正确编写使用类并与 uglify.js 和 npm 一起使用的 React 组件?

【问题讨论】:

  • 类是 UglifyJS 无法解析的特性,因此您将需要一个转译器(如 Babel)。你的 NPM 包应该提供模块的转译版本,或者你的 React 项目应该转译你的模块(不那么标准)

标签: javascript reactjs npm uglifyjs


【解决方案1】:

React.createClass 已被弃用,因为它将在即将发布的版本中从主 react 包中删除,但you can still use the now-separate create-react-class package instead 如果您仍然需要/想要使用它编写组件而不会收到弃用警告。


如果您使用 ES6 类编写将发布到 npm 的组件,则需要添加一个转换步骤,以便在可预见的未来将 ES5 代码发布到 npm,因为 - 正如您所看到的 - 工具不支持 ES6 的会破坏它们,而使用它们的应用程序会破坏原生不支持 ES6 类的浏览器(例如 IE11)。

如果您已经将 Babel 设置为转译 JSX,那么在发布之前转译类就不需要太多额外的工作 - 安装 babel-preset-es2015 预设并将其添加到您的 Babel 配置中。


即使我们达到了工具和浏览器中的 ES6 支持不再是问题的地步,与 createClass 相比,标准 ES6 类也不是编写 React 组件的一种非常方便的方式,因为它们引入了 constructor 样板,需要手动绑定方法,需要单独声明propTypes等静态属性。

通常使用提议的语言特性的实验性实现(babel-preset-stage-2 涵盖了最有用的特性)来克服这些便利特性(甚至上面关于在没有 ES6 的情况下编写 React 组件的文档也有一个例子)并转换它们不用 Babel 插件,所以如果你使用这些功能,你将不得不继续编译你的代码!

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多