[TOC]
# 基本概念
静态的**import**语句用于导入由另一个模块导出的绑定。无论是否声明了 [`strict mode`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode "如果你想改变你的代码,让其工作在具有限制性JavaScript环境中,请参阅转换成严格模式。"),导入的模块都运行在严格模式下。
> 在浏览器中,`import`语句只能在声明了`type="module"`的`script`的标签中使用。
语法
~~~
import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import("module-name");//这是一个处于第三阶段的提案。
~~~
`defaultExport`
导入模块的默认导出接口的引用名。
`module-name`
要导入的模块。通常是包含目标模块的`.js`文件的相对或绝对路径名,可以不包括`.js`扩展名。某些特定的打包工具可能允许或需要使用扩展或依赖文件,它会检查比对你的运行环境。只允许单引号和双引号的字符串。
`name`
导入模块对象整体的别名,在引用导入模块时,它将作为一个命名空间来使用。
`export, exportN`
被导入模块的导出接口的名称。
`alias, aliasN`
将引用指定的导入的名称。
## 描述
`name`参数是“导入模块对象”的名称,它将用一种名称空间来引用导入模块的接口。export参数指定单个的命名导出,而`import * as name`语法导入所有导出接口,即导入模块整体。以下示例阐明该语法。
## 导入整个模块的内容
这将`myModule`插入当前作用域,其中包含来自位于`/modules/my-module.js`文件中导出的所有接口。
~~~js
import * as myModule from '/modules/my-module.js';
~~~
在这里,访问导出接口意味着使用模块名称(在本例为“myModule”)作为命名空间。例如,如果上面导入的模块包含一个接口`doAllTheAmazingThings()`,你可以这样调用:
~~~js
myModule.doAllTheAmazingThings();
~~~
## 导入单个接口
给定一个名为`myExport`的对象或值,它已经从模块`my-module`导出(因为整个模块被导出)或显式地导出(使用[`export`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/export "在创建JavaScript模块时,export 语句用于从模块中导出函数、对象或原始值,以便其他程序可以通过 import 语句使用它们。")语句),将`myExport`插入当前作用域。
~~~js
import {myExport} from '/modules/my-module.js';
~~~
## 导入多个接口
这将`foo`和`bar`插入当前作用域。
~~~js
import {foo, bar} from '/modules/my-module.js';
~~~
## 导入带有别名的接口
你可以在导入时重命名接口。例如,将`shortName`插入当前作用域。
~~~js
import {reallyReallyLongModuleExportName as shortName}
from '/modules/my-module.js';
~~~
## 导入时重命名多个接口
使用别名导入模块的多个接口。
~~~js
import {
reallyReallyLongModuleMemberName as shortName,
anotherLongModuleName as short
} from '/modules/my-module.js';
~~~
## 仅为副作用而导入一个模块
整个模块仅为副作用(中性词,无贬义含义)而导入,而不导入模块中的任何内容(接口)。 这将运行模块中的全局代码, 但实际上不导入任何值。
~~~
import '/modules/my-module.js';
~~~
## 导入默认值
`引入模块可能有一个default`[`export`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/export "在创建JavaScript模块时,export 语句用于从模块中导出函数、对象或原始值,以便其他程序可以通过 import 语句使用它们。")(无论它是对象,函数,类等)可用。然后可以使用`import`语句来导入这样的默认接口。
最简单的用法是直接导入默认值:
~~~js
import myDefault from '/modules/my-module.js';
~~~
也可以同时将`default`语法与上述用法(命名空间导入或命名导入)一起使用。在这种情况下,`default`导入必须首先声明。 例如:
~~~js
import myDefault, * as myModule from '/modules/my-module.js';
// myModule used as a namespace
~~~
或者
~~~js
import myDefault, {foo, bar} from '/modules/my-module.js';
// specific, named imports
~~~
## 动态import
关键字import可以像调用函数一样来动态的导入模块。以这种方式调用,将返回一个`promise`。
~~~
import('/modules/my-module.js')
.then((module) => {
// Do something with the module.
});
~~~
这种使用方式也支持`await`关键字。
~~~
let module = await import('/modules/my-module.js');
~~~
# 实践
## 标准导入
下面的代码将会演示如何从辅助模块导入以协助处理AJAX JSON请求。
### 模块:file.js
~~~js
function getJSON(url, callback) {
let xhr = new XMLHttpRequest();
xhr.onload = function () {
callback(this.responseText)
};
xhr.open('GET', url, true);
xhr.send();
}
export function getUsefulContents(url, callback) {
getJSON(url, data => callback(JSON.parse(data)));
}
~~~
### 主程序:main.js
~~~js
import { getUsefulContents } from '/modules/file.js';
getUsefulContents('http://www.example.com',
data => { doSomethingUseful(data); });
~~~
## 动态导入
此示例展示了如何基于用户操作去加载功能模块到页面上,在例子中通过点击按钮,然后会调用模块内的函数。当然这不是能实现这个功能的唯一方式,`import()`函数也可以支持`await`。
~~~js
const main = document.querySelector("main");
for (const link of document.querySelectorAll("nav > a")) {
link.addEventListener("click", e => {
e.preventDefault();
import('/modules/my-module.js')
.then(module => {
module.loadPageInto(main);
})
.catch(err => {
main.textContent = err.message;
});
});
}
~~~
- 内容介绍
- EcmaScript基础
- 快速入门
- 常量与变量
- 字符串
- 函数的基本概念
- 条件判断
- 数组
- 循环
- while循环
- for循环
- 函数基础
- 对象
- 对象的方法
- 函数
- 变量作用域
- 箭头函数
- 闭包
- 高阶函数
- map/reduce
- filter
- sort
- Promise
- 基本对象
- Arguments 对象
- 剩余参数
- Map和Set
- Json基础
- RegExp
- Date
- async
- callback
- promise基础
- promise-api
- promise链
- async-await
- 项目实践
- 标签系统
- 远程API请求
- 面向对象编程
- 创建对象
- 原型继承
- 项目实践
- Classes
- 构造函数
- extends
- static
- 项目实践
- 模块
- import
- export
- 项目实践
- 第三方扩展库
- immutable
- Vue快速入门
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入门
- 模板语法
- 计算属性和侦听器
- Class 与 Style 绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
- 组件注册
- Prop
- 自定义事件
- 插槽
- 混入
- 过滤器
- 项目实践
- 标签编辑
- 移动客户端开发
- uni-app基础
- 快速入门程序
- 单页程序
- 底部Tab导航
- Vue语法基础
- 模版语法
- 计算属性与侦听器
- Class与Style绑定
- 样式与布局
- Box模型
- Flex布局
- 内置指令
- 基本指令
- v-model与表单
- 条件渲染指令
- 列表渲染指令v-for
- 事件与自定义属性
- 生命周期
- 项目实践
- 学生实验
- 贝店商品列表
- 加载更多数据
- 详情页面
- 自定义组件
- 内置组件
- 表单组件
- 技术专题
- 状态管理vuex
- Flyio
- Mockjs
- SCSS
- 条件编译
- 常用功能实现
- 上拉加载更多数据
- 数据加载综合案例
- Teaset UI组件库
- Teaset设计
- Teaset使用基础
- ts-tag
- ts-badge
- ts-button
- ta-banner
- ts-list
- ts-icon
- ts-load-more
- ts-segmented-control
- 代码模版
- 项目实践
- 标签组件
- 失物招领客户端原型
- 发布页面
- 检索页面
- 详情页面
- 服务端开发技术
- 服务端开发环境配置
- Koajs快速入门
- 快速入门
- 常用Koa中间件介绍
- 文件上传
- RestfulApi
- 一个复杂的RESTful例子
- 使用Mockjs生成模拟数据
- Thinkjs快速入门
- MVC模式
- Thinkjs介绍
- 快速入门
- RESTful服务
- RBAC案例
- 关联模型
- 应用开发框架
- 服务端开发
- PC端管理界面开发
- 移动端开发
- 项目实践
- 失物招领项目
- 移动客户端UI设计
- 服务端设计
- 数据库设计
- Event(事件)
- 客户端设计
- 事件列表页面
- 发布页面
- 事件详情页面
- API设计
- image
- event
- 微信公众号开发
- ui设计规范