导入React,{Component}而不仅仅是React的好处是什么?

时间:2017-06-13 08:43:23

标签: javascript reactjs ecmascript-6

写作的主要好处是什么

import React, { Component } from 'react';
class Link extends Component {
   ...
}

而不是

import React from 'react';
class Link extends React.Component {
   ...
}

当谈到反应15.4.x ??

我的观点在我的情况下(如果我错了,请纠正我)从来没有关系:

  1. 我正在使用webpack2制作我的捆绑包;
  2. 我使用代码拆分将我的应用代码与供应商代码分开;
  3. 我使用带有webpack.optimize.CommonsChunkPlugin设置的minChunks: Infinity插件,以确保所有供应商代码仅包含一次。
  4. 从了解ES6导入如何工作我明白通过使用{Component}的命名导入,我声明我只想在我的代码中使用Component组件,它看起来更干净。 但由于整个React包仍然在应用中使用,我可以使用React.Component而不仅仅是Component创建扩展类,并且在结果中,webpack仍会生成相同数量的代码,我的捆绑尺寸在两种情况下都是相同的。

    我说错了吗?

2 个答案:

答案 0 :(得分:9)

没有区别,byte[] bytes = Convert.FromBase64String(parameter); string parameter= Encoding.UTF8.GetString(bytes); React.Component是同一个对象,第二种方式在我看来更有说服力,因为它确实解释了你使用的是Component对象Component库。

第一个似乎是指成员, 但是,它来自javascript的React,其中所有内容都必须附加到导出的全局命名空间(只是为了避免全局命名空间污染)。

可能是幕后的事情:

pre modules era

注意:正如有人所说,您还需要导入// this should be assumed as an example only. class React { ... } class Component { ... } React.Component = Component; // ES6 export {Component} export default React; // ES5 window.React = React; ,因为React需要在范围内使用它,但是,如果您想避免它,则可以在全球范围内公开JSXReact

答案 1 :(得分:7)

此导入声明:

import React, { Component } from 'react';

真的做了两件事。它以名称default导入React导出(这只是一个约定,你可以称之为你想要的)。它还会导入命名导出Component

导入默认React的原因实际上是为了使JSX正常工作。当您的JSX代码被转换后,它会用<div>替换React.DOM.div(),所以React必须存在,否则事情会中断!

单独导入两个内容意味着您的JSX可以正常工作,但您可以在代码中编写Component而不是React.Component

当您执行import任何from "react"时,整个文件将以任一方式包含在内 - 任何减少包大小的尝试(例如死代码消除,树抖动)都是额外的,单独的步骤,它不依赖于您的import语句,而是您使用的代码部分。

对于这个库,理智的事情发生了:默认导出的子Component引用与命名导出Component相同的东西。

但是,请记住,事实并非如此!如果React库代码包含以下内容:

export default {
    Component: "foo"
};

export const Component = "bar";

然后React.Component === "foo"Component === "bar"

相关问题