Javascript-default-import-vs-named-import

Posted by AlstonWilliams on February 17, 2019

在写React Native代码时,遇到了一个问题.

在一个组件中用import {React, Component} from ‘react’;导入React依赖时,老是提示undefined is not a function(evaluating ‘_react.React.createElement’).

由于调试起来特别不方便,我们又不能从错误栈中得到什么有用的信息,所以搞得我有点懵.捣鼓了好长时间没解决.

后来,发现React Native中自带的index.android.js中,导入React依赖用的是下面这条语句:import React, {Component} from ‘react’;

就想碰碰运气,修改了一下,结果竟然真成了!!!!

你们能想象当时我心中一万个草泥马奔腾而过的场景吗?!

于是,就查了查这两者到底有什么区别.

下面是从Stack Overflow上面得到的答案.

感觉default importnamed import翻译成中文有点难翻译,索性就不翻译了.直接用英文昵称得了.

default import

下面这种形式就是default import: import A from ‘./A’

只有A.js中,包含了一条export default **语句时,它才能生效.比如,export default 42**.

不管你是从A.js中import什么,比如: import A from ‘./A’ import MyA from ‘./A’ import Something from ‘./A’

它们对应的都是解析成导入A.js中的export default对应的对象.

named import

named import是下面这种形式: import {A} from ‘./A’

只有当A.js中包含了一条export A的语句时,它才会生效.比如: export const A = 42

named import,括号中的名字很关键!

如果A.js中只有export const A = 42这条语句,那下面的语句都将不会生效:

** import {MyA} from ‘./A’; import {Something} from ‘./A’; **

为了让上面的那两条语句生效,你需要在A.js中添加如下内容:

** export const MyA = 42; export const Something = 42; **

结合

一个js文件中,只能有一个default export语句,但是可以有多个named export **.例如,如果你的A.js内容如下: **export default 42 export const myA = 43 export const Something = 44

那你可以通过下面的语句将它们导入进来: import A, {myA, Something} from ‘./A’;

链接

StackOverflow上的解释