JavaScript 在ES6之前没有给出官方模块的定义,因此社区自己搞了两个模块加载方案:

  • CommonJS (node)
  • AMD (browser) 本文略

CommonJS规范

module定义:

每个文件就是一个模块,文件有自己的私有内部作用域。module对象代表当前模块,module.exports 是对外暴露的接口。加载模块,实际上是加载 module.exports.

exportsmodule.exports 的引用,其实质是 node 提供的语法糖, 本质类似于每个模块开头都include了下面的代码。

var exports = module.exports;

如修改exports对象的属性,等价于修改了module.exports。虽然这样提供了方便,但是直接改变exports对象的指向是个不好的实践。

let a = 100;

exports.a = 200;

引入的时候,require 导入的是 module.exports 指向的一个对象。

//test.js
var a = require('/utils');
// var {a} = require('/utils'); //200
console.log(a) // {a : 200}

ES6 规范

export命令

export 命令定义了模块的输出、其值可以是 value,variable、function、class,

//profile.js
export var lastName = "xxx" // 或者
var firstName = "xxx"
//优先使用这种,便于统一一个地方export
export {firstName} // export function
export function (radius) {
return Math.PI * radius * radius;
} export function circumference(radius) {
return 2 * Math.PI * radius;
}

import命令

import {firstName, lastName} from 'profile'; //变量
import { area, circumference } from 'circle'; //方法

import大括号内的变量名必须与export一致。(在webstrom等IDE中会帮你静态检查的)

module命令

module 是个语法糖。有时候,需要import所有的接口

大专栏  module in JavaScriptle>

可以写成

import * as circle from 'circle';

console.log("圆面积:" + circle.area(4));
console.log("圆周长:" + circle.circumference(14));
module circle from 'circle'

export default 命令

export default命令定义了模块导出的默认值,引入默认值时不用加大括号。这个命令其实也是语法糖:

把导出值封装到了一个default对象,再在引入时解构这个default对象。因为有一个对象来承接中间的值,所以在import时可以用任意key指定被引入的值

export default class { ... }

import MyClass from 'MyClass'
let o = new MyClass();

Babel

在ES6出来之前社区上已经有许多CommonJS的module,托Babel的福,可以直接使用ES6的新语法来引入这些只支持CommonJS标准的库。

Babel 做了一层翻译,把ES6的import、export语法变成了兼容CommonJS规范的require、exports。

1. export babel翻译:

export const foo = 42;
export default 21;
;

Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;

上面可以看到export default 和普通的export foo一样,都是给exports对象添加属性。

2. import babel翻译:

import React from 'react'

==========>

'use strict';

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

//通过_react2.default引用

export default 和 import 的使用要结合一起看:

上面的export default翻译为了exports.default

import命令则要先判断:对经过了 babel 翻译后export的module直接返回对象,否则先用对象包装一层,并把export值赋值给default属性;最终在代码中使用时,统一使用moduleName.default 引用。

普通的非default import语法就简单了,和require一模一样,导入时需要添加{}

import {Component} from 'react'

===========>

'use strict';

var _react = require('react');
//通过_react.Component引用

参考

  1. http://es6.ruanyifeng.com/#docs/module
  2. http://babeljs.io/repl/

module in JavaScript的更多相关文章

  1. ES6之module

    该博客原文地址:http://www.cnblogs.com/giggle/p/5572118.html 一.module概述 JavaScript一直没有模块体系,但是伴随着ES6的到来,modul ...

  2. [译]你应该知道的4种JavaScript设计模式

    这里介绍下面这4种设计模式 Module Prototype Observer Singleton 每种模式有许多属性构成,在这我只强调一下几点: 1 Context: 在何种情况使用哪种模式? 2 ...

  3. javascript pattern

    bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...

  4. module、export、require、import的使用

    module 每个文件就是一个模块.文件内定义的变量.函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见. 每个文件内部都有一个module对象,它包含以下属性 id: 模块的识别符,通 ...

  5. 转:彻底搞清楚javascript中的require、import和export

    原文地址:彻底搞清楚javascript中的require.import和export   为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Ja ...

  6. 彻底搞清楚javascript中的require、import和export

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

  7. javascript模块导入导出

    第一次知道javascript有模块的概念通常都是使用<script>标签进行引入,不过只能在html文件上使用 增加的模块就如同php里的include.require可以使用引入的内容 ...

  8. 那些相见恨晚的 JavaScript 技巧

    JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript ...

  9. javascript的模块发展

    谨以此文记录了解js模块的过程 随着ES6的出现,js模块已经成为正式的标准了.曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD).SeaJs(CMD).Node(Common ...

随机推荐

  1. setTimeout()执行时序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  2. 好看的UI组合,为以后自己写组件库做准备

    1. 黑色格子背景 { color: rgb(255, 255, 255); text-shadow: 1px 1px 0 rgba(0,0,0,.3); rgb(62, 64, 74); backg ...

  3. Laravel常见问题总结

    1.Whoops, looks like something went wrong. 一般报这个问题是由于复制框架文件时没有把相应的env (隐藏文件) 复制 导致新复制的框架没有配置选项 解决方法: ...

  4. mysql命令行操作大全

    Mysql安装目录 数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysql ...

  5. IIS设置禁止某个IP或IP段访问网站的方法

    网站被刷,对话接不过来 打开IIS,选中禁IP的站点,找到“ip地址和域限制”这个功能,如果没有安装,打开服务器管理器,点击角色,窗口右边找到添加角色服务,找到“IP和域限制”并勾选安装. 打开ip地 ...

  6. 爬虫笔记(十一)——认识cookie

    什么是cookie? 在爬虫的使用中,如果涉及登录等操作时,经常会使用到cookie.简单的来说,我们访问每一个互联网页面,都是通过HTTP协议进行的,而HTTP协议是一个无状态协议,所谓的无状态协议 ...

  7. [CTS2019]随机立方体(容斥+组合数学)

    这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...

  8. 46)PHP,PHP语言为啥需要服务器

    1)用户的 Web 浏览器发出 HTTP 请求,请求特定 Web 页面. 2)Web服务器收到.php 的请求获取该文件,并将它传到 PHP 引擎,要求它处理. 3)PHP 引擎开始解析脚本. 脚本中 ...

  9. MySQL数据库简单操作

    title date tags layout MySQL简单操作 2018-07-16 Linux post 登录mysql mysql -h 主机名 -u 用户名 -p 查看所有数据库 show d ...

  10. 常用面试sql(1)

    1:update qr_user_info set score =score+50 where level=3 2:delete from qr_user_info where level is nu ...