<script type="module"> import { User } from "./as.js"; console.log(User); </script>
像下面这样在 {} 中导入是错误的,模块默认是在顶层静态导入,这是为了分析使用的模块,方便打包
1 2 3
if (true) { import { site, func } from "./as.js"; // Error }
批量导入
也可使用批量导入语法import * as alias ,一次性将所有暴露的接口导入,并为批量导入的接口起一个别名,之后通过别名来访问批量导出的对象。
*整体为一个Object,为其设置别名后通过alias.propName访问导出的具体变量
1 2 3 4 5
<script type="module"> import * as api from "./hd.js"; console.log(api.site); console.log(api.User); </script>
导入建议
因为以下几点,我们更建议使用明确导入方式
使用webpack 构建工具时,没有导入的功能会删除节省文件大小
可以更清晰知道都使用了其他模块的哪些功能
别名使用
别名导入
可以为导入的模块重新命名,语法: import { oldName as newName …}
应用场景
有些导出的模块命名过长,起别名可以更加简洁
本模块与导入模块 变量重名时,可以通过起别名防止冲突
1 2 3 4 5 6 7 8 9 10 11
let title="阿顺特烦恼"; const site = "ashuntefannao"; const func = function() { return "is a module function"; }; class User { show() { console.log("user.show"); } } export { site, func, User };
模块导入使用 as 对接口重命名,本模块中已经存在 func 变量,需要对导入的模块重命名防止命名错误。
1 2 3 4 5 6 7
<script type="module"> import { User as user, func as method, site as name } from "./as.js"; let func = "ashunMethod"; console.log(name); console.log(user); console.log(method); </script>
别名导出
模块可以对 暴露给外部的接口 起别名,下面是as.js 模块对暴露的接口起别名
1 2 3 4 5 6 7 8 9 10 11
let title="阿顺特烦恼"; const site = "ashuntefannao"; const func = function() { return "is a module function"; }; class User { show() { console.log("user.show"); } } export { site, func as method, User as user };
export default class { static show() { console.log("User.method"); } }
如果将一个导出的接口 分配别名为 default 也算默认导出
1 2 3 4 5 6
class User { static show() { console.log("User.method"); } } export { User as default };
导入时就不需要使用 {} 来导入了
1 2 3 4
<script type="module"> import User from "./hd.js"; User.show(); </script>
默认导出的接口 在引入时 可以随意命名
1 2 3 4
<script type="module"> import as from "./hd.js"; as.show(); </script>
混合导出
模块可以存在默认导出与命名导出。
使用export default 导出默认接口,使用 export {} 导入普通接口
1 2 3 4 5 6 7 8 9 10 11
let title="阿顺特烦恼"; const site = "ashuntefannao"; const func = function() { return "is a module function"; }; export default class { show() { console.log("user.show"); } } export { site, func };
也可以结合别名oldName as default综合导出各个接口
1 2 3 4 5 6 7 8 9 10 11
let title="阿顺特烦恼"; const site = "ashuntefannao"; const func = function() { return "is a module function"; }; class User { show() { console.log("user.show"); } } export { site, func, User as default };
导入默认接口时不需要使用 {} ,普通接口还用 {} 导入
1 2 3 4 5 6 7
<script type="module"> //可以将 as 替换为任何变量 import as from "./as.js"; import { site } from "./as.js"; console.log(site); as.show(); </script>
可以使用一条语句导入默认接口与常规接口,使用,隔开
1
import show, { name } from "/modules/ashun.js";
也可以使用别名导入 默认导出的接口
default as 自定义名称,之后通过 自定义的变量 访问默认导出接口
1 2 3
import { site, default as as } from "./as.js"; console.log(site); as.show();
如果是批量导入时,使用 alias.default 获得默认导出
1 2 3 4 5
<script type="module"> import * as api from "./as.js"; console.log(api.site); api.default.show(); </script>
使用建议
对于默认导出和命名导出有以下建议
不建议使用默认导出,会让开发者导入时随意命名
1 2
import as from "./as.js"; import shun from "./as.js";
如果使用默认导入,自定义的名称最好和 模块的文件名 有关联,会使用代码更易阅读
1
import as from "./as.js";
导出合并
解决问题
可以将导入的模块重新导出使用,比如项目模块比较多如下所示,这时可以将所有模块合并到一个入口文件中。
这样只需要使用一个模块入口文件,而不用关注多个模块文件
1 2 3 4
|--test1.js |--test2.js |--test3.js ...
实际使用
下面是 test1.js 模块内容
1 2 3 4 5
const site = "阿顺特烦恼"; const func = function () { console.log("is a module function"); }; export { site, func };
下面是 test2.js 模块内容
1 2 3 4 5
export default class { static get() { console.log("ashun.js.get"); } }
下面是 test3.js 模块内容
1 2 3
export function method() { console.log("test3 method"); }