昨天帮一个网友解决一个typescript的问题,看了一下,归根结底仍是对js的import和export用法的不熟悉。让我想起来当年学这个知识点的时候,也是云里雾里跌跌撞撞『猜』了好久用法,踩过坑。
当时主要看的是阮一峰的这篇文章 hptt://es6.ruanyifengcom,里面讲了不少怎么实现和许多细节性的东西,固然很全面,只是,对咱们做为语言的使用者来讲,有点让人抓不到重点,因此按照本身的理解整理了一下。javascript
首先,吐槽一下,单单一个export和import搭配使用的方式就好几种,设计的过于复杂了,记忆和使用的心理负担过重,按个人理解来讲,一个功能应该有且只有一种语法糖(忘了这是哪一种编程语言的设计哲学了),因此我一段时间内就一直使用一种,我称之为基本使用方式。java
好比模块A 向外部提供变量a1和函数fn供其余模块调用,那么咱们在模块B中调用a1和fn。程序员
//A.js var a1=111 function fn(){ } export {a1,fn} //在文件的底部统一导出,即便有时候导出的变量只有一个也这样写
那么在B.js中调用的形式就是这样:es6
//B.js import {a1,fn} from './A' console.log(a1) fn()
调用的时候 统一使用 import {xxx,xxx2,xxx3} from 'xxx'
的形式调用。
固然了若是只用到其中一个变量或函数,那么只须要import进来须要的那个就好了,好比import {a1} from './A'
.typescript
但有时候遇到这种状况,名字重复好比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使用就和上面的基本状况同样了,就不赘述了。
还有一种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万的巨款——有没有被吓到?
而且这东西万恶地增长了代码复杂度……