面向未来的 ES6 模块标准

既然模块化已经越来越重要,那么从语言层面上直接去解决这个问题就显得很有必要(况且其他语言早就有了)。于是 ES6 直接在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

设计思想

简单来说,ES6 模块的设计思想就是:一个 JS 文件就代表一个 JS 模块。在模块中你可以使用 import 和 export 关键字来导入或导出模块中的东西。

ES6 模块主要具备以下几个基本特点:

  • 自动开启严格模式,即使你没有写 use strict
  • 每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域
  • 模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等
  • 每一个模块只加载一次,每一个 JS 只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象

export

export 命令用于规定模块的对外接口。如果你希望外部能够读取模块内部的变量,函数或类等,就必须使用 export 关键字输出该内容。

下面我们以个人所得税计算为一个模块,来具体使用下 export:

// 个人所得税计算模块
// 在线参考站点:[个人所得税](http://www.gerensuodeshui.cn/)
// personal-income-tax.js

// 个税起征点
export const taxBasicNum = 3500;

// 税率等级
export const taxRatioLevel = [
    {
        num: 1500, // 小于1500
        ratio: ‘3%‘,
        subtract: 0, // 速算扣除数
    },
    {
        num: 4500, // 大于1500,小于4500
        ratio: ‘10%‘,
        subtract: 105,
    },
    {
        num: 9000, // 大于4500,小于9000
        ratio: ‘20%‘,
        subtract: 555,
    },
    {
        num: 35000, // 大于9000,小于35000
        ratio: ‘25%‘,
        subtract: 1005,
    },
    {
        num: 55000,  // 大于35000,小于55000
        ratio: ‘30%‘,
        subtract: 2755,
    },
    {
        num: 80000,  // 大于55000,小于80000
        ratio: ‘35%‘,
        subtract: 5505,
    },
    {
        num: 80000,  // 大于80000
        ratio: ‘45%‘,
        subtract: 13505,
    }];

// 所缴税收
// 应纳税所得额 = 应发工资 - 五险一金 - 个税起征点
// 所缴税收 = 应纳税所得额 * 税率 - 速算扣除数
export function calTax (num, insurance) {
    let taxShouldNum = num - insurance - taxBasicNum;
    let tax;
    switch (true) {
        case taxShouldNum < taxRatioLevel[0].num:
            tax = taxShouldNum * taxRatioLevel[0].ratio - taxRatioLevel[0].subtract;
            break;
        case taxShouldNum < taxRatioLevel[1].num:
            tax = taxShouldNum * taxRatioLevel[1].ratio - taxRatioLevel[1].subtract;
            break;
        case taxShouldNum < taxRatioLevel[2].num:
            tax = taxShouldNum * taxRatioLevel[2].ratio - taxRatioLevel[2].subtract;
            break;
        case taxShouldNum < taxRatioLevel[3].num:
            tax = taxShouldNum * taxRatioLevel[3].ratio - taxRatioLevel[3].subtract;
            break;
        case taxShouldNum < taxRatioLevel[4].num:
            tax = taxShouldNum * taxRatioLevel[4].ratio - taxRatioLevel[4].subtract;
            break;
        case taxShouldNum < taxRatioLevel[5].num:
            tax = taxShouldNum * taxRatioLevel[5].ratio - taxRatioLevel[5].subtract;
            break;
        case taxShouldNum > taxRatioLevel[6].num:
            tax = taxShouldNum * taxRatioLevel[6].ratio - taxRatioLevel[6].subtract;
            break;
        default:
            tax = 0;
    }

    return tax;
}

// 实发工资
export function calWages(num, insurance) {
    let tax = calTax(num, insurance);
    let wages = num - insurance - tax;

    return wages;
}

import

使用 export 命令定义了模块的对外接口以后,其他 JS 文件就可以通过 import 命令加载这个模块。现在我们导入前面设计的个人所得税计算模块。

// main.js
import {taxBasicNum, taxRatioLevel, calTax, calWages} from ‘./personal-income-tax‘;

// 可以使用 taxBasicNum 输出一段话,说明个税的起征点是多少
console.log(`个税起征点为:taxBasicNum`);
// 还可以使用 taxRatioLevel 数据输出一个表格,对应各个等级的税率,这里就不演示了

// 计算20000元缴纳了五险一金3000后,应该缴纳多少税收及实际税后工资为多少
let tax = calTax(20000, 3000);
let wages = calWages(20000, 3000);

更多 ES6 模块知识

通过上面的 export 和 import 的使用,是不是觉得 ES6 的模块很方便,也很简单。当然上面都是些基础的运用,而关于 ES6 模块网上也已经有了很多详细的文档,我们在这就不一一介绍了,这里推荐两篇详细文档以供参考学习:

注:目前现代浏览器对 ES6 模块支持程度不同,所以一般都是使用 babel 把 ES6 代码转化为兼容的 ES5 版本的代码。

时间: 2024-10-11 13:03:55

面向未来的 ES6 模块标准的相关文章

面向未来的友好设计:Future Friendly

一年前翻译了本文的一部分,最近终于翻译完成.虽然此设计思想的提出已经好几年了,但是还是觉得应该在国内推广一下,让大家知道“内容策略”,“移动优先”,“响应式设计”,“原子设计”等设计思想和技术的根源.这些概念最早其实是由luke wroblewski,brad frost等人在同一个设计思想框架下提出的.笔者经“面向未来的友好设计(Future Friendly Web Design)”设计理念联合创始人Jason Grigsby授权,将此设计思想框架首次翻译为中文版本. 能力所限,敬请指正,欢

ES6模块的import和export用法总结

ES6之前以前出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs前者主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载.同时还有CMD规范,为同步加载方案如seaJS. ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案. ES6模块主要有两个功能:export和import export用于对外输出本模块(一个文件

Es6模块语法

/** * Created by Administrator on 2017/4/15. */ /*---------------------export命令---------------------*/ //Es6 的模块加载 //defer是"渲染完再执行",async是"下载完就执行". //浏览器对于带有type="module"的<script>,是异步加载,等同于打开了<script>标签的defer属性. /

Python强大的自有模块——标准库

引言:Python的强大体现在"模块自信"上,因为Python不仅有很强大的自有模块(标准库),还有海量的第三方模块(或者包.库),并且很多开发者还在不断贡献在自己开发的新模块(或者包.库).本文将向大家概述介绍Python的自有模块--标准库. 本文选自<跟老齐学Python:轻松入门>. "Python自带'电池'",这种说法流传已久. 在Python被安装的时候,就有不少模块也随着安装到本地的计算机上了.这些东西就如同"电力"一

ES6模块的import和export用法

ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范.commonjs主要应用于服务器,实现同步加载,如nodejs.AMD规范应用于浏览器,如requirejs,为异步加载.同时还有CMD规范,为同步加载方案如seaJS. ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案. ES6模块主要有两个功能:export和import export用于对外输出本模块(一个文件可以

es6模块 nodejs模块和 typescript模块

es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export 原文地址:https://www.cnblogs.com/mttcug/p/8120274.html

commonjs模块和es6模块的区别?

commonjs模块和es6模块最主要的区别:commonjs模块是拷贝,es6模块是引用,但理解这些,先得理解对象复制的问题,在回过头来理解这两模块的区别. 一.基本数据类型的模块 ./a1.js es6模块 export var a1 = 1; setTimeout(() => a1 = 2, 500); ./a2.js commojs模块 var a2 = 2; module.exports = a2; setTimeout(() => a2 = 3 ,500); ./index.js

面向未来编程

我们一直以来都知道面向对象编程,面向过程编程.大多数时候还是面向工资编程,面向生活编程.面向任务编程,面向公司编程,面向领导编程. 工资不给力,心里认为委屈:生活有压力.影响工作情绪.任务完毕就好,应付一下咯.都是公司的事儿,完毕了就拉倒吧.领导喜欢什么体位就按什么体位来搞喽. 这样导致的结果呢,宝宝有苦可是不说. 工作不开心,压力大.状态不好就导致项目代码不好.文档不够,设计不行,项目管理混乱,对上都是敷衍,对下都是放羊,里外都没有交代. 实际上,我们首先应该是面向自己编程,然后是面向团队编程

ES6 模块与 CommonJS 模块的差异

ES6 模块与 CommonJS 模块的差异 区别 CommonJS 模块 ES6 模块 原因 起作用的时机 CommonJS 模块是运行时加载(运行时) ES6 模块是编译时输出接口(编译时) CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成.而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成. 模块输出 CommonJS 模块输出的是一个值的拷贝 ES6 模块输出的是值的引用 出处:http://es6.