export和import

  export和import是JavaScript中ES6(ECMAScript 2015)的模块系统的语法,用于实现模块的导出和导入,ES6 的模块系统是 JavaScript 官方标准中定义的模块化规范,现在的前端应用模块化已经很普及了。
  export和import的技术细节有很多,下面做一总结。
  一、实时监视JS文件的运行
  ⑴为了在VSCode中编辑js文件并实时监视该文件的运行,需要安装nodemon,下面是进行全局安装。

npm install -g nodemon

  ⑵新建一个目录,在该目录下运行:

npm init -y

  在该目录下生成一个新的 `package.json` 文件并使用默认值进行初始化,
  ⑶打开 `package.json` 文件,添加type字段并设置为"module",这样就可以在js文件中使用ES模块语法了。
  ⑷实时监视JS文件的运行

nodemon myfile.js

  ⑸中断运行
  按下Ctrl+C即可

  二、export和import技术细节
  一般情况下,先声明再导出。

//声明
const PI=3.1415926

function add(a,b){
    return a + b
}

function sub(a,b){
    return a - b
}

function multi(a,b){
     return a * b
}
//导出
export {PI,add,sub,multi}

  也可以在声明时导出。

export const PI=3.1415926

export const  add=(a,b)=>{
    return a + b;
}

export const sub=function(a,b) {
    return a - b;
}

export const  multi=(a,b)=>{
    return a *b
}

  ⑴命名(具名)导出与导入
  这是最为常见的用法,命名(具名)导出可以导出多个值、函数、对象,由于指定了名称,方便追踪与维护。

//命名(具名)导出
export const PI=3.1415926

export const  add=(a,b)=>{
    return a + b;
}

export const sub=function(a,b) {
    return a - b;
}

export const  multi=(a,b)=>{
    return a *b
}
//命名(具名)导入
import { PI,add,sub,multi } from "./myexport.js";

console.log(PI);
console.log(add(1,2));
console.log(sub(1,2));
console.log(multi(1,2));

  也可以选择性地导入:

import {PI} from "./myexport.js";
import {add} from "./myexport.js";
import {sub} from "./myexport.js";
import {multi} from "./myexport.js";

  ⑵默认导出与导入

  默认导出适合功能单一的模块,由于对导出与导入做了简化,代码比较简洁。

//声明时默认导出
export default function add(a,b){
    return a+b
}
//导入时最好与导出时的名称一致
import add from "./myexport.js";
console.log(add(1,2));

  默认导出时可以不使用函数名称。

export default function(a,b){
    return a + b
}

  ⑶既有默认导出又有具名导出时,可以使用大括号,也可以不使用大括号的方式来导入
  既有默认导出又有具名导出时,需要注意,假如导出文件内容:

export const PI=3.1415926
export const add=(a,b)=>a+b;
export const sub=(a,b)=>{
    return a - b
}
export default function multi(a,b){
    return a * b*10
}

  导入内容为:

import add from "./myexport.js";
console.log(add(1,2));

  显然结果时20,因为导入的add对应的是默认导出的函数multi。如果全部使用,正确的写法是:

import { PI,add,sub,default as multi } from "./myexport.js";

console.log(PI);
console.log(add(1,2));
console.log(sub(1,2));
console.log(multi(1,2));

  或者,注意默认导出的导入一定要放在最前面:

import multi,{ PI,add,sub }   from "./myexport.js";

  上面时选择使用了{}方式,如果不使用{}方式,可以将所有导出内容作为一个对象导入,如下使用:

import * as myexport from "./myexport.js";

console.log(myexport.PI);
console.log(myexport.add(1, 2));
console.log(myexport.sub(1, 2));
console.log(myexport.default(1, 2));

  可以选择性地导入:

import {PI} from "./myexport.js";
import {add} from "./myexport.js";
import {sub} from "./myexport.js";
import { default as  multi} from "./myexport.js";

  ⑷使用as关键字
  在上面的例子中,在导入时已经使用了as关键字,这是为了避免在使用时的上下文冲突,在导出时也可以使用as,但是这个并不推荐,因为这样不如直接修改源代码了。

  ⑸聚合后重新导出
  比如再建立一个聚合模块Aggregationmodule.js,内容如下:

import { PI,add,sub,default as multi } from "./myexport.js";

export { PI,add,sub,multi }

  myimport.js直接导入这个聚合模块即可:

import { PI,add,sub,multi } from "./Aggregationmodule.js";

console.log(PI);
console.log(add(1,2));
console.log(sub(1,2));
console.log(multi(1,2));

  这种方式适合在一个目录下有很多模块文件,可以将需要导出的函数或者变量集中在一个文件中比如index.js,这样在导入时只需要导入该目录下的index.js即可。
  ⑹动态导入

try {
    const myObj = await import("./Aggregationmodule.js");
    console.log("导入正常");
    console.log(myObj.PI);
    console.log(myObj.add(1, 2));
    console.log(myObj.sub(1, 2));
    console.log(myObj.multi(1, 2));
} catch (e) {
    console.log("导入时发生错误:" + e);
}

  或者:

try{
    const { PI,add,sub,multi } =await import( "./Aggregationmodule.js");
    console.log(PI);
} catch(e){
    console.log("导入时发生错误:"+e);
}

你可能感兴趣的:(JavaScript,JavaScript,export,import,ES6)