引入 React 的正确方式

662 阅读2分钟

背景

常见的两种引入方式:

1. import React from 'react';

2. import * as React from 'react';

这两种写法目前都可以运行,但是出于同一个目的却出现两种写法就容易产生分歧,对于新手来说更是摸不着头脑。我刚开始工作的时候对于第二种写法就是一脸懵逼,不明所以。

便捷性

从便捷的角度来讲,第一种引入方式无疑是最好的选择,因为更简洁。在引入react包内其它导出项时,体现得更加明显:

import React, { useState } from 'react';

export default function MyComponent() {
    const [foo, setFoo] = useState();
    
    return <>{foo}</>
}

对比第二种写法:

import * as React from 'react';

export default function MyComponent() { 
    const [foo, setFoo] = React.useState();
    
    return <>{foo}</>
}

这里只能通过React命名空间来引用内部导出项,React.xxx

或者单独再导出一遍:

import * as React from 'react';
import { useState } from 'react';

无论怎么写,都没有第一种引入方式便捷。

语法和语义

ES 语法里并没有命名空间的语法。第一种引入方式对应的导出方式为:export defaultexport关键字是作用于当前文件的,export default只是export的一个特例,用于导出一个特殊的名字,并不能用来导出一个命名空间。

从语义的角度来讲,第一种写法就是错误的,React仅仅是作为一个命名空间存在的,我们并不会像使用一个值一样来使用React。从 React.16.13.0开始,React的导出方式也已经更正为export {xxx, ...}的形式了。

第一种导入方式之所以还能使用,是因为目前React的构建产物是CommonJS规范的,webpack等构建工具做了兼容。

总结

如何导出决定如何导入

【不再推荐】import React from 'react';
【兼容性好】import * as React from 'react';

扩展

导入样式同理:

import styles from './index.less';
import * as styles from './index.less';

最后

如果文中有错误或者不足之处,欢迎大家在评论区指正。

你的点赞是对我莫大的鼓励!感谢阅读~