1.前言
在项目中遇到将单个的函数抽出在多个js文件中使用,对于其import几种方式及区别进行了学习。
如下为在项目中常见的几种导入方式:
import React from 'react';
import 'echarts/lib/chart/line';
import { Select, Menu, Breadcrumb, Icon, Popover }from 'antd';
import *as actionfrom '../../actions/OptionAction';
import {injectIntl }from 'react-intl';
import ClassNames from 'classnames';
import './fitterInformationAll.less';
2.import概念
ES6模块主要有两个功能:export和import
export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口
import用于在一个模块中加载另一个含有export接口的模块。
也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。
// main.js
var name="Tom";
var fun=function(value){
console.log(value)
}
export {name,fun}
//通过向大括号中添加name,fun变量并且export输出,就可以将对应变量值以name、fun变量标识符形式暴露给其他文件而被读取到
// child.js
// 通过import获取main.js文件的内部变量,{}括号内的变量来自于main.js文件export出的变量标识符。
import {name,fun} from "./main.js"
console.log(name) // Tom
前面的例子可以看出,main.js使用import命令的时候,用户需要知道main.js所暴露出的变量标识符,否则无法加载。可以使用export default命令,为模块指定默认输出,这样就不需要知道所要加载模块的变量名。
3.import常见几种方式及区别
import defaultExportfrom "module-name";
import *as namefrom "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, export2as alias2, [...] } from"module-name";
import defaultExport, {export [, [...] ] } from"module-name";
import defaultExport, *as namefrom "module-name";
import "module-name";
var promise =import("module-name");//这是一个处于第三阶段的提案。
name参数是“导入模块对象”的名称,它将用一种名称空间来引用导入模块的接口。export参数指定单个的命名导出,而import * as name语法导入所有导出接口,即导入模块整体。以下示例阐明该语法。
(1)导入整个模块的内容
这将myModule插入当前作用域,其中包含来自位于/modules/my-module.js文件中导出的所有接口。
import *as myModulefrom '/modules/my-module.js';
(2)导入单个接口
给定一个名为myExport的对象或值,它已经从模块my-module导出(因为整个模块被导出)或显式地导出(使用export语句),将myExport插入当前作用域。
import {myExport}from '/modules/my-module.js';
(3)导入多个接口
这将foo和bar插入当前作用域。
import {foo, bar}from '/modules/my-module.js';
(4)导入带有别名的接口
可以在导入时重命名接口。例如,将shortName插入当前作用域。
import {reallyLongModuleExportNameas shortName}from '/my-module.js';
(5)导入时重命名多个接口
import {
reallyReallyLongModuleMemberNameas shortName,
anotherLongModuleNameas short
}from '/modules/my-module.js';
(6)仅为副作用而导入一个模块
整个模块仅为副作用(中性词,无贬义含义)而导入,而不导入模块中的任何内容(接口)。 这将运行模块中的全局代码, 但实际上不导入任何值。
import '/modules/my-module.js';
(7)导入默认值
引入模块可能有一个defaultexport(无论它是对象,函数,类等)可用。然后可以使用import语句来导入这样的默认接口。
最简单的用法是直接导入默认值:
import myDefaultfrom '/modules/my-module.js';
也可以同时将default语法与上述用法(命名空间导入或命名导入)一起使用。在这种情况下,default导入必须首先声明。 例如:
import myDefault, *as myModulefrom '/modules/my-module.js';