Webpack入门,模块打包之ES6 Module

JavaScript之父Brendan Eich在最初设计这门语言时,并没有包含模块的概念。基于越来越多的工程需要,为了使用模块化进行开发,JavaScript社区涌现出了多种模块标准,其中也包括CommonJS。一直到2015年6月,由TC39标准委员会正式发布了ES6(ECMA Script 6.0),自此JavaScript语言才具备了模块这一特性。

请看下面的例子,使用ES6的方式改写前面的calculator.js和index.js

// calculator.js
export default {
  name: 'calculator',
  add: function(a,b) {
    return a + b;
  }
}
// index.js
import calculator from './calculator.js';
const sum = calculator.add(5.6);
console.log(sum);

从示例中可看出,ES6 Module也是将每个文件作为一个模块,每个模块拥有自身的作用域,不同的是导入、导出语句。

注意

ES6 Module会自动采用严格模式,该模式在ES5中只是一个可选项。也就是说,以前开发者可以通过选择是否在文件开始时加上use strict来控制严格模式,而在ES6 Module中不管开头是否有use strict都会采用严格模式。所以,在将原本时CommonJS的模块或者任何未开启严格模式的代码改写为ES6 Module时要注意这一点。

导出

在ES6 Module中使用export命令来导出模块。export有两种形式:命名导出与默认导出。

// 命名导出
// 写法一
export const name = 'calculator';
export const add = function(a,b) {return a + b;};

// 写法二
const name = 'calculator';
const add = function(a,b) {return a + b;};
export {name,add};
// 用此写法可以使用as关键字对变量重命名
// export {name,add as getSum};
// 默认导出
// 与命名导出不同,模块的默认导出只能有一个
export default {
  name: 'calculator';
  add: function(a,b) {
    return a + b;
  }
}

开发者可以将export default理解为对外输出了一个名为default变量,因此不需要像命名导出一样进行变量声明,直接导出值即可。

// 导出字符串
export default "This is default export string";

// 导出class
export default class {...}

// 导出匿名函数
export default function() {...}

导入

ES6 Module中使用import语法导入模块。

// index.js
// 针对命名导出的导入写法
import {name,add} from './calculator.js';
add(5,6);

// 与命名导出类似,也可在导入时,使用as关键字对变量重命名
import {name,add as getSum} from './calculator02.js';
// 如果命名导出多个变量,可以使用整体导入的方式
import * as calculator from 'calculator.js';
console.log(calculator.name);


// 针对默认导出的导入写法
import calculator from "./calculator.js";
const sum = calculator.add(9,8);
console.log("sum",sum);

加载带有命名导出的模块时,import后面要跟一对大括号来将导入的变量包裹起来,并且这些变量名应该与导出的变量完全一致。导入变量的效果相当于在当前作用域下声明了这些变量,并且不可对其进行更改,也就是所导入的变量都是只读的。

提示

使用import * as <myModule>可以把所有导入的变量作为属性值添加到<myModule>对象中,从而减少对当前作用域的影响。这点在处理默认导出上很类似,import后面直接跟变量名,并且这个名字可以自由指定,它指代了模块中默认导出的值。从原理上可以理解为import {default as <myModule>} from ‘./calculator.js’

扩展

在工程中,有时需要把某一个模块导入之后立即导出,比如专门用来集合所有页面或组件的入口文件。此时可以采用复合写法

// 复合写法
// 此写法只支持采用命名导出方式的模块,如果被导入模块使用默认导出方式,只能将导入和导出分开写
export {name,add} from './calculator.js';

示例代码仓库

https://gitee.com/zero_79152105/webpack-vblog

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/webpack-es6-module.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年11月10日
下一篇 2022年11月12日

相关推荐

  • 前端常见跨域解决方案

    跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。 广义的跨域: 资源跳转: A链接、重定向、表单提交 资源嵌入: <link>、<scr…

    2019年3月25日
    3.4K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    1.1K
  • 前端遍历树形数据,返回满足条件的树形数据

    在一次做手机端小程序项目中,有一个机构表单项,需要在页面展示是树形层级结构,但是后端开发人员返回的数据却是一维数组,而且还要在前端做过滤筛选功能。但是在使用的手机端组件库中,却没有…

    2022年11月8日
    600
  • Java自学之异常的捕获与处理

    在程序开发中,程序的编译与运行是两个不同的阶段,编译主要针对的是语法检测,而在程序运行时却有可能出现各种各样的错误导致程序中断执行,那么这些错误在Java中统一称为异常。 异常处理…

    2020年12月11日
    1.6K
  • CSS让内容居中的方法总结

    内容水平居中  分行内元素与块级元素两种情况;其中块级元素又分定宽与不定宽两种情况; 行内元素 首先看它的父元素是不是块级元素,如果是,则直接给父元素设置 te…

    2019年6月28日
    3.6K
  • Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 。 后端收到请求,验证用户名和密码,验证成功,就给…

    2019年8月8日
    5.3K
  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.4K
  • css如何利用transparent属性设置透明度?transparent属性绘制各种三角形

    想到用css设置元素透明度,大家的第一反应会是:用Opacity属性来设置透明度,其实在css中还有其他设置透明度的方法。本章给大家介绍用transparent属性设置透明度,以及…

    2021年2月25日
    1.5K
  • Spring Tools学习之JAVA开发环境搭建【windows 10】

    一直以来都想学习JAVA,但是苦于找不到门路,网上学习资料要不看不懂,要不需要金钱。 终于,迫于生活与年龄的压力,下定决心,学习JAVA。 写下此文档,记录一下自己学习JAVA之路…

    2018年12月6日
    3.2K
  • CSS卡片堆栈

    在浏览各种APP及网站,往往会发现很多酷炫的布局及样式。搜集一下,补充自己的技能库,借鉴学习一下。 HTML CSS

    2019年12月31日
    2.2K