百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

JS之export

citgpt 2024-10-20 01:47 6 浏览 0 评论

export

在创建 JavaScript 模块时,export 语句用于从模块中导出实时绑定的函数、对象或原始值,以便其他程序可以通过 import 语句使用它们。被导出的绑定值依然可以在本地进行修改。在使用 import 进行导入时,这些绑定值只能被导入模块所读取,但在 export 导出模块中对这些绑定值进行修改,所修改的值也会实时地更新。

JS之export


无论您是否声明,导出的模块都处于严格模式。export 语句不能用在嵌入式脚本中。


语法

存在两种 exports 导出方式:


命名导出(每个模块包含任意数量)

默认导出(每个模块包含一个)

export let name1, name2, …, nameN; // also var, const

export let name1 = …, name2 = …, …, nameN; // also var, const

export function FunctionName(){...}

export class ClassName {...}


// 导出列表

export { name1, name2, …, nameN };


// 重命名导出

export { variable1 as name1, variable2 as name2, …, nameN };


// 解构导出并重命名

export const { name1, name2: bar } = o;


// 默认导出

export default expression;

export default function (…) { … } // also class, function*

export default function name1(…) { … } // also class, function*

export { name1 as default, … };


// 导出模块合集

export * from …; // does not set the default export

export * as name1 from …; // Draft ECMAScript® 2O21

export { name1, name2, …, nameN } from …;

export { import1 as name1, import2 as name2, …, nameN } from …;

export { default } from …;

nameN 要导出的标识符(以便其他脚本通过 import 语句进行导入).


描述

有两种不同的导出方式,命名导出和默认导出。你能够在每一个模块中定义多个命名导出,但是只允许有一个默认导出。每种方式对应于上述的一种语法:


命名导出:


// 导出事先定义的特性

export { myFunction, myVariable };


// 导出单个特性(可以导出 var,let,

//const,function,class)

export let myVariable = Math.sqrt(2);

export function myFunction() { ... };

默认导出:


// 导出事先定义的特性作为默认值

export { myFunction as default };


// 导出单个特性作为默认值

export default function () { ... }

export default class { .. }


// 每个导出都覆盖前一个导出

在导出多个值时,命名导出非常有用。在导入期间,必须使用相应对象的相同名称。


但是,可以使用任何名称导入默认导出,例如:


// 文件 test.js

let k; export default k = 12;


// 另一个文件

import m from './test'; // 由于 k 是默认导出,所以可以自由使用 import m 替代 import k

console.log(m);        // 输出为 12

你也可以重命名命名导出以避免命名冲突:


export { myFunction as function1,

         myVariable as variable };

重导出 / 聚合

为了使模块导入变得可用,在一个父模块中“导入/导出”这些不同模块也是可行的。也就是说,你可以创建单个模块,集中多个模块的多个导出。


这个可以使用“export from”语法实现:


export { default as function1,

function2 } from 'bar.js';


与之形成对比的是联合使用导入和导出:


import { default as function1,

         function2 } from 'bar.js';

export { function1, function2 };

但这里的 function1 和 function2 在当前模块中变得不可用。


备注: 尽管与 import 等效,但以下语法在语法上无效:


import DefaultExport from 'bar.js'; // 有效的


export DefaultExport from 'bar.js'; // 无效的

这里正确的做法是重命名这个导出:


export { default as DefaultExport } from 'bar.js';

示例

使用命名导出


在模块 my-module.js 中,可能包含以下代码:


// module "my-module.js"

function cube(x) {

  return x * x * x;

}


const foo = Math.PI + Math.SQRT2;


var graph = {

    options: {

        color:'white',

        thickness:'2px'

    },

    draw: function() {

        console.log('From graph draw function');

    }

}


export { cube, foo, graph };

然后,在你的 HTML 页面的顶级模块中:


import { cube, foo, graph } from 'my-module.js';


graph.options = {

    color:'blue',

    thickness:'3px'

};


graph.draw();

console.log(cube(3)); // 27

console.log(foo);    // 4.555806215962888

着重注意以下几点:


在你的 HTML 中需要包含 type="module" 的 <script> 元素这样的脚本,以便它被识别为模块并正确处理

不能通过 file:// URL 运行 JS 模块 — 这将导致 CORS 错误。你需要通过 HTTP 服务器运行。

使用默认导出


如果我们要导出一个值或得到模块中的返回值,就可以使用默认导出:


// module "my-module.js"


export default function cube(x) {

  return x * x * x;

}

然后,在另一个脚本中,可以直接导入默认导出:


import cube from './my-module.js';

console.log(cube(3)); // 27

模块重定向

举个例子,假如我们有如下层次结构:


childModule1.js: 导出 myFunction 和 myVariable

childModule2.js: 导出 myClass

parentModule.js: 作为聚合器(不做其他事情)

顶层模块:调用 parentModule.js 的导出项

你的代码看起来应该像这样:


// childModule1.js 中

let myFunction = ...; // assign something useful to myFunction

let myVariable = ...; // assign something useful to myVariable

export {myFunction, myVariable};


// childModule2.js 中

let myClass = ...; // assign something useful to myClass

export myClass;


// parentModule.js 中

// 仅仅聚合 childModule1 和 childModule2 中的导出

// 以重新导出他们

export { myFunction, myVariable } from 'childModule1.js';

export { myClass } from 'childModule2.js';


// 顶层模块中

// 我们可以从单个模块调用所有导出,因为 parentModule 事先

// 已经将他们“收集”/“打包”到一起

import { myFunction, myVariable, myClass } from 'parentModule.js'


相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: