ES6 export 和 export default的区别

昨天帮一个网友解决一个typescript的问题,看了一下,归根结底还是对js的import和export用法的不熟悉。让我想起来当年学这个知识点的时候,也是云里雾里跌跌撞撞『猜』了很久用法,踩过坑。
当时主要看的是阮一峰的这篇文章 hptt://es6.ruanyifengcom,里面讲了很多怎么实现和许多细节性的东西,当然很全面,只是,对我们作为语言的使用者来说,有点让人抓不到重点,所以按照自己的理解整理了一下。

首先,吐槽一下,单单一个export和import搭配使用的方式就好几种,设计的过于复杂了,记忆和使用的心理负担太重,按我的理解来说,一个功能应该有且只有一种语法糖(忘了这是哪种编程语言的设计哲学了),所以我一段时间内就一直使用一种,我称之为基本使用方式。

基本用法

比如模块A 向外部提供变量a1和函数fn供其他模块调用,那么我们在模块B中调用a1和fn。


//A.js
var a1=111
function fn(){
} export {a1,fn} //在文件的底部统一导出,即使有时候导出的变量只有一个也这样写

那么在B.js中调用的形式就是这样:


//B.js
import {a1,fn} from './A' console.log(a1)
fn()

调用的时候 统一使用 import {xxx,xxx2,xxx3} from 'xxx'的形式调用。
当然了如果只用到其中一个变量或函数,那么只需要import进来需要的那个就行了,比如import {a1} from './A'.

但有时候遇到这种情况,名字重复比如B.js里面已经有个变量叫a1了,那么就加个 as 起个别名。


//B.js
import {a1 as a111,fn} from './A' console.log(a111)
fn()

还有一种常用的import是这样的:


import * as A from './A'
console.log(A.a1)

这个怎么理解记忆呢,就是A模块在代码里不是这样导出的吗——export {a1,fn} 这里看成导出了一个对象,对应我们import * as A from './A里面的 *,然后我们给它起了个别名叫A,当然叫A是为了记忆使用的方便,你可以叫其他什么abcd,那么调用的时候就是abcd.a1 abcd.fn.

以上就是一种 export 和两种import 的搭配使用方式。在我自己早期import和export也是各种组合用,自己把自己搞糊涂了,最后发现就这俩套路翻来覆去的用,就能解决问题。

各自导出的方式

当然了,除了自己写代码,还经常调用别人写的代码,比如有这个C模块:


export var c1 = 222
//
//
//
export function fn() { }

我一般不推荐这种写法,缺点之一是导出的变量或者函数分散在代码的各个地方,没有一个统一管理的地方,另一个缺点是不能够直观的让人理解导出的形式。不过如果是别人写的话我们也没有办法,那我们自己可以在脑子里把他成想象成之前说的的那种导出方式:


var c1 = 222
//
//
//
function fn() { } export{c1,fn}

那么怎么import使用就和上面的基本情况一样了,就不赘述了。

default的用法

还有一种export用法


//C.js
var c1 = 222
//
//
//
function fn() { } var c2=222 export { c1,fn}
export default c2

注意这里的c2前面加了个default,那这个有啥用的呢,就是其他模块import的时候能简单点——少写一对大括号。


import c2 from "./C";

当然这里有个所谓的『优点』就是直接起别名import c222 from "./C"相当于import c2 as c222 from "./C"

然后如果我们的代码里还使用了C模块的其他变量或函数,那就要这样了


import c2 ,{c1,fn} from "./C";

你就会发现import的用法瞬间成笛卡尔积复杂起来:加大括号的、不加大括号的、起别名加as的、不加as的、import*的、不带星的再乘以export的分开export的、不分开export的 default和不default的…………

所以还是推荐我文章开始推崇的那种基本写法,虽然死板些,但是能cover到后面的几种情况,本质上后面几种是基本形式的特殊情况,本意设计出来是为了写代码的时候能少写几个字符,可是这东西带来『巨大』的心智成本(理解成本和记忆成本)和时间成本,你别说『哎~那是你水平有限这么简单的东西都搞不定』,但我身边不少bat的程序员都踩过这个坑,假如一个程序员要花十分钟来学习理解记忆,那10个程序员就是100分钟,100个程序员就是1000分钟……100万个程序员就是1000万分钟,按程序员的时薪XX计算,那就是一笔3000万的巨款——有没有被吓到?

并且这东西万恶地增加了代码复杂度……

来源:https://segmentfault.com/a/1190000017419857

JS/TS 的 import 和 export 用法小结的更多相关文章

  1. ES6模块的import和export用法总结

    ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步 ...

  2. ES6模块的import和export用法

    ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载 ...

  3. JS Replace 全部替换字符的用法小结

    script language="javascript">var r= "1\n2\n3\n";//将字母\n替换成分号alert(r.replace(& ...

  4. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  5. export ,export default 和 import 区别 以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  6. export ,export default 和 import 区别以及用法

    首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...

  7. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  8. [ES6]import 与export的用法 ,export 与export default 的 区别 以及用法

    一.import 与export export(导出):用于对外输出本模块(一个文件可以理解为一个模块)变量的接口: import(导入):用于在一个模块中加载另一个含有export接口的模块. 1. ...

  9. 转:彻底搞清楚javascript中的require、import和export

    原文地址:彻底搞清楚javascript中的require.import和export   为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Ja ...

随机推荐

  1. Oracle Partition 分区详细总结

    此文从以下几个方面来整理关于分区表的概念及操作:        1.表空间及分区表的概念        2.表分区的具体作用        3.表分区的优缺点        4.表分区的几种类型及操作 ...

  2. ubuntu问题解答集锦

    一.su root提示认证失败 su root提示认证失败 ubuntu root是默认禁用了,不答应用root登陆,所以先要设置root密码.   执行:sudo passwd root 接着输入密 ...

  3. Nk 1214 Relatives(欧拉函数)

    Time Limit: 1500 ms    Memory Limit: 10000 kB   Total Submit : 234 (77 users)   Accepted Submit : 10 ...

  4. *Codeforces961G. Partitions

    $k \leq n \leq 100000$,求式子$Ans=\sum_{i=1}^n w_i\sum_{j=1}^n j\binom{n-1}{n-j} \{ ^{n-j}_{k-1} \}$. 题 ...

  5. 玩转css样式选择器----当父元素有多个子元素时选中第一个

  6. 使用 ftrace 调试 Linux 内核,第 3 部分

    内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通 ...

  7. Virnish使用

    缓存基础原理 程序具有局部性 时间局部性 空间局部性 key-value 形式存储数据 key 访问路径.URL.hash value web content 命中率 hit/(hit+miss) 文 ...

  8. 搭建Redis环境以及所遇问题(CentOS7+Redis 3.2.8)

    一.安装步骤 1. 首先需要安装gcc,把下载好的redis-3.2.8-rc2.tar.gz 放到/usr/local文件夹下 2. 进行解压 tar -zxvf redis-3.2.8-rc2.t ...

  9. android layout

    android的视图分为两类,一类是布局,另一个类是控件 一.LinearLayout(线性布局) 最常用布局之一,线性布局的特性是每添加一个控件默认会在上个控件的下面占一行. <LinearL ...

  10. Codeforces 833B The Bakery(主席树 + 决策单调性优化DP)

    题目链接 The Bakery 题目大意:目标是把$n$个数分成$k$组,每个组的值为这个组内不同的数的个数,求$k$个组的值的和的最大值. 题目分析: 这道题我的解法可能和大众解法不太一样……我用主 ...