在之前的 javascript 中一直是没有模块系统的,前辈们为了解决这些问题,提出了各种规范, 最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。而 ES6 中提供了简单的模块系统,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。

基本用法

es6 中新增了两个命令 export 和 import , export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能。

一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个 变量,就必须使用export关键字输出该变量。下面是一个JS文件,里面使用export命令输出变量。

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
  1. // math.js
  2.  
  3. export const add = function (a, b) {
    return a + b
    }
  4.  
  5. export const subtract = function (a, b) {
    return a - b
    }

使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。

  1. 1
    2
    3
    4
    5
  1. // main.js
    import { add, subtract } from './test.js'
  2.  
  3. add(1, 2)
    substract(3, 2)

export 详细用法

上面介绍了模块化最基础的用法,export 不止可以导出函数,还可以导出对象,类,字符串等等

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  1. export const obj = {
    test1: ''
    }
  2.  
  3. export const test = ''
  4.  
  5. exrpot class Test {
    constuctor() {
    }
    }

export的写法,除了像上面这样,还有另外一种。

  1. 1
    2
    3
    4
    5
    6
    7
    8
  1. let a = 1
    let b = 2
    let c = 3
    export {
    a,
    b,
    c
    }

上面代码在export命令后面,使用大括号指定所要输出的一组变量。它与前一种写法是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。

通过 as 改变输出名称

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
  1. // test.js
    let a = 1
    let b = 2
    let c = 3
    export {
    a as test,
    b,
    c
    }
  1. 1
  1. import { test, b, c} from './test.js' // 改变命名后只能写 as 后的命名

上面啊的写法中,import 中需要指定加载的变量名或函数名,否则无法加载。但是,用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法。

export default 指定默认输出, import 无需知道变量名就可以直接使用

  1. 1
    2
    3
    4
    5
  1. // test.js
  2.  
  3. export default function () {
    console.log('hello world')
    }
  1. 1
    2
    3
  1. import say from './test.js' // 这里可以指定任意变量名
  2.  
  3. say() // hello world

有了export default命令,加载模块时就非常直观了,以一些常用的模块为例

  1. 1
    2
    3
  1. import $ from 'jQuery' // 加载jQuery 库
    import _ from 'lodash' // 加载 lodash
    import moment from 'moment' // 加载 moment

import 详细用法

import 为加载模块的命令,基础使用方式和之前一样

  1. 1
    2
    3
    4
    5
    6
  1. // main.js
    import { add, subtract } from './test'
  2.  
  3. // 对于export default 导出的
  4.  
  5. import say from './test'

通过 as 命令修改导入的变量名

  1. 1
    2
    3
  1. import {add as sum, subtract} from './test'
  2.  
  3. sum (1, 2)

加载模块的全部

除了指定输出变量名或者 export.default 定义的导入, 还可以通过 * 号加载模块的全部.

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
  1. // math.js
  2.  
  3. export const add = function (a, b) {
    return a + b
    }
  4.  
  5. export const subtract = function (a, b) {
    return a - b
    }
  1. 1
    2
    3
    4
  1. import * as math from './test.js'
  2.  
  3. math.add(1, 2)
    math.subtract(1, 2)

开始使用 ES6

上面介绍了,es6 中模块的使用方式,但是现在es6的模块化,无论在浏览器端还是 node.js 上都没有得到很好的支持,所以需要,一些转码的工具。使我们可以用es6的方式来编码,最后输出es5的代码。

这里推荐一款基于 es6 模块化方式的打包神器 rollup,它使用 Tree-shaking 的技术打包,基本可以做到零冗余的代码,而且配置简单,打包速度也够快。

安装 rollup

首先在 package.json 中加上 rollup 打包依赖的包

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
  1. {
    // ...
    "devDependencies": {
    "babel-core": "^6.13.0",
    "babel-preset-es2015-rollup": "^1.1.1",
    "rollup": "^0.34.3",
    "rollup-plugin-babel": "^2.6.1",
    "rollup-plugin-commonjs": "^3.3.1",
    "rollup-plugin-node-resolve": "^2.0.0",
    "rollup-plugin-uglify": "^1.0.1"
    }
    }

编写打包程序

下面是我的打包程序

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
  1. // build.js
    var rollup = require('rollup');
    var babel = require('rollup-plugin-babel'); // babel 插件
    var uglify = require('rollup-plugin-uglify'); // js 混淆压缩插件
    var npm = require('rollup-plugin-node-resolve'); // 使用第三方包依赖
    var commonjs = require('rollup-plugin-commonjs'); // CommonJS模块转换为ES6
    rollup.rollup({
    entry: 'src/index.js', //入口文件
    plugins: [ // 插件配置
    npm({ jsnext: true, main: true }),
    commonjs(),
    uglify(),
    babel({
    exclude: 'node_modules/**',
    presets: [ "es2015-rollup" ]
    })
    ]
    }).then(function(bundle) {
    // 打包之后生成一个 `budble` 把它写入文件即可
    bundle.write({
    // 转化格式 cjs 代表 commonJs, 还支持 iife, amd, umd, es6 ....
    format: 'cjs',
    banner: 'si_log.js v0.1.1', //文件顶部的广告
    dest: 'dist/si_log_common.js'
    });
    });

在 package.json 中加上执行脚本

  1. 1
    2
    3
    4
    5
    6
    7
  1. {
    // ...
    "scripts": {
    // ...
    "build": "node build.js"
    },
    }

然后,执行命令

  1. 1
  1. npm run build

ok 到这里打包就都结束了。

ES6的模块化的更多相关文章

  1. [译]使用6to5,让今天就来写ES6的模块化开发!

    http://es6rocks.com/2014/10/es6-modules-today-with-6to5/?utm_source=javascriptweekly&utm_medium= ...

  2. 使用6to5,让今天就来写ES6的模块化开发!

    http://es6rocks.com/2014/10/es6-modules-today-with-6to5/?utm_source=javascriptweekly&utm_medium= ...

  3. es6的模块化编程

    es6的模块化编程 基本用法 es6 中新增了两个命令 export 和 import , export 命令用于规定模块的对外接口,import 命令用于输入其他模块提供的功能. 一个模块就是一个独 ...

  4. ES6(Module模块化)

    模块化 ES6的模块化的基本规则或特点: 1:每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取. 一个模块就是一个单例,或者说就是一个对象: 2:每一个 ...

  5. ES6之模块化

    本文介绍ES6实现模块化的方法:使用import和export. 导入的时候需不需要加大括号的判断:1.当用export default people导出时,就用 import people 导入(不 ...

  6. 面试 11-01.ES6:模块化的使用和编译环境

    11-01.ES6:模块化的使用和编译环境 #前言 #ES6的主要内容 模块化的使用和编译环境 Class与JS构造函数的区别 Promise的用法 ES6其他常用功能 本文来讲"模块化的使 ...

  7. ES6的模块化规范和CommonJS的模块化规范的差异

    ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,旨在成为浏览器和服务器通用的模块解决方案.其模块功能主要由两个命令构成:export 和 import.export命令用于规定模块的对 ...

  8. 深入浅出ES6教程模块化

    大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Promise的用法,下面我们一起来继续学习模块化: JavaScript本身是不支持模块化的,只不过后来一些社区的大佬制定了 ...

  9. 5-5 ES6的模块化的基本规则或特点

    一.AMD, CMD, CommonJs和ES6对比 1.AMD ==> 是RequireJS在推广过程中对模块定义的规范化产出 // RequireJS定义标准, 导步加载依赖, 依赖前置 d ...

随机推荐

  1. Swift 全功能的绘图板开发

    要做一个全功能的绘图板,至少要支持以下这些功能: 支持铅笔绘图(画点) 支持画直线 支持一些简单的图形(矩形.圆形等) 做一个真正的橡皮擦 能设置画笔的粗细 能设置画笔的颜色 能设置背景色或者背景图 ...

  2. java第二周学习日记

    day01 1.抽象类 (1)抽象类的应用场景: 我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前不是具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种 ...

  3. 触控(Touch)

    1 使用触控实现一个简易的画板 1.1 问题 触控(Touch)是一个UITouch类型的对象,当用户触摸了屏幕上的视图时自动被创建,通常使用触控实现绘图.涂鸦.手写等功能.本案例使用触控实现一个简易 ...

  4. tabbar加小红点

    原文   http://blog.csdn.net/u013531246/article/details/44460115 #import <UIKit/UIKit.h> @interfa ...

  5. sketchup 导出 fbx文件 单位 错误

    最近在使用sketchup导出fbx文件到unity中使用时,发生了尺度单位上的错误.按照网上给出的标准教程,选定模型的单位为十进制-米.导出时选项选择'米',但是得到的fbx文件在unity中出现了 ...

  6. SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)

    1.为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00,MSB设置为1).这样,DAC输出(VDAC)被设为VREF/2,VREF是提供给ADC的基准电压.然后,比较判断VI ...

  7. python 连接Mysql数据库

    1.下载http://dev.mysql.com/downloads/connector/python/ 由于Python安装的是3.4,所以需要下载下面的mysql-connector-python ...

  8. Azure上A/D系列虚拟机到DS系列迁移(1)

    有一些用户在刚开始的时候创建了A7,D14等虚拟机来跑一些IO要求比较高的应用,比如Oracle数据库,MySQL数据库,等到用户量上来之后,性能不够,需要升级数据磁盘到SSD固态硬盘,但是问题是: ...

  9. Google谷歌搜索引擎登录网站 - Blog透视镜

    建置好了网站之后,为了能提升流量或是增加曝光度,Mix通常会到Google谷歌,用手动登录的方式,登录网站,不久之后,搜索引擎就会派遣蜘蛛机器人,来检索你的网站,等一段时间之后,就会出现在搜索引擎内, ...

  10. POI3.10 根据Excel模版导出数据测试

    1:所需jar包 2:Mysql数据库表内容如下: 3:代码结构如下: (1)User.java public class User { private int id; private String ...