JS/TS 的 import 和 export 用法小结(转)

本文总结了JavaScript和TypeScript中import和export的基础用法,包括导出变量和函数、导入别名以及default导出的使用场景。强调了统一的导出和导入方式可以降低理解和记忆成本,减少代码复杂度。建议遵循简单易懂的导出导入规范以提高代码可读性和团队协作效率。

转自:JS/TS 的 import 和 export 用法小结

昨天帮一个网友解决一个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万的巨款——有没有被吓到?

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

提供的引用内容未提及SWC优化JS/TS代码体积的方法,不过根据一般的前端构建代码优化知识,SWC可以通过以下常见方式来优化JS/TS代码体积: ### 代码压缩 SWC可以对代码进行语法层面的压缩,去除不必要的空格、换行符、注释等。例如将多行代码压缩成一行,将长变量名替换为短变量名,同时对代码结构进行优化,减少冗余代码。以下是一个简单的代码示例,展示代码压缩前后的变化: ```javascript // 压缩前 function add(a, b) { // 这是一个加法函数 return a + b; } // 压缩后 function add(a,b){return a+b} ``` ### 死代码消除 SWC能够分析代码的执行流程,找出那些永远不会被执行到的代码(死代码),并将其从最终的代码中移除。比如一些条件判断中永远不会成立的分支代码,或者定义了但从未被调用的函数等。示例如下: ```javascript // 包含死代码的代码 function func1() { return 1; } function func2() { if (false) { // 这是死代码 return 2; } return 3; } // 经过死代码消除后 function func1() { return 1; } function func2() { return 3; } ``` ### 模块打包与摇树优化 对于使用模块化开发的项目,SWC可以将多个模块打包成一个或少数几个文件,减少文件数量。同时,利用摇树优化(Tree Shaking)技术,只保留代码中实际被使用的部分,去除未使用的导出内容。例如在ES6模块中: ```javascript // utils.js export function add(a, b) { return a + b; } export function subtract(a, b) { return a - b; } // main.js import { add } from './utils.js'; console.log(add(1, 2)); // 经过摇树优化后,subtract函数不会被包含在最终代码中 ``` ### 代码分割 根据应用的路由、功能等因素,将代码分割成多个小块,实现按需加载。这样在用户访问应用时,只加载当前页面所需的代码,而不是一次性加载整个应用的代码,从而减少初始加载的代码体积。例如在React中使用动态导入进行代码分割: ```jsx import React, { lazy, Suspense } from 'react'; // 动态导入组件 const LazyComponent = lazy(() => import('./LazyComponent')); function App() { return ( <div> <Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </Suspense> </div> ); } export default App; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值