module in JavaScript
JavaScript 在ES6之前没有给出官方模块的定义,因此社区自己搞了两个模块加载方案:
- CommonJS (node)
- AMD (browser) 本文略
CommonJS规范
module定义:
每个文件就是一个模块,文件有自己的私有内部作用域。module对象代表当前模块,module.exports 是对外暴露的接口。加载模块,实际上是加载 module.exports.
exports 是 module.exports 的引用,其实质是 node 提供的语法糖, 本质类似于每个模块开头都include了下面的代码。
var exports = module.exports; |
如修改exports对象的属性,等价于修改了module.exports。虽然这样提供了方便,但是直接改变exports对象的指向是个不好的实践。
let a = 100; exports.a = 200; |
引入的时候,require 导入的是 module.exports 指向的一个对象。
//test.js |
ES6 规范
export命令
export 命令定义了模块的输出、其值可以是 value,variable、function、class,
//profile.js |
import命令
import {firstName, lastName} from 'profile'; //变量
|
import大括号内的变量名必须与export一致。(在webstrom等IDE中会帮你静态检查的)
module命令
module 是个语法糖。有时候,需要import所有的接口
import * as circle from 'circle';
console.log("圆面积:" + circle.area(4));
|
module circle from 'circle' |
export default 命令
export default命令定义了模块导出的默认值,引入默认值时不用加大括号。这个命令其实也是语法糖:
把导出值封装到了一个default对象,再在引入时解构这个default对象。因为有一个对象来承接中间的值,所以在import时可以用任意key指定被引入的值
export default class { ... }
import MyClass from 'MyClass'
|
Babel
在ES6出来之前社区上已经有许多CommonJS的module,托Babel的福,可以直接使用ES6的新语法来引入这些只支持CommonJS标准的库。
Babel 做了一层翻译,把ES6的import、export语法变成了兼容CommonJS规范的require、exports。
1. export babel翻译:
export const foo = 42; |
;
Object.defineProperty(exports, "__esModule", {
|
上面可以看到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');
|
参考
module in JavaScript的更多相关文章
- ES6之module
该博客原文地址:http://www.cnblogs.com/giggle/p/5572118.html 一.module概述 JavaScript一直没有模块体系,但是伴随着ES6的到来,modul ...
- [译]你应该知道的4种JavaScript设计模式
这里介绍下面这4种设计模式 Module Prototype Observer Singleton 每种模式有许多属性构成,在这我只强调一下几点: 1 Context: 在何种情况使用哪种模式? 2 ...
- javascript pattern
bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...
- module、export、require、import的使用
module 每个文件就是一个模块.文件内定义的变量.函数等等都是在自己的作用域内,都是自身所私有的,对其它文件不可见. 每个文件内部都有一个module对象,它包含以下属性 id: 模块的识别符,通 ...
- 转:彻底搞清楚javascript中的require、import和export
原文地址:彻底搞清楚javascript中的require.import和export 为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Ja ...
- 彻底搞清楚javascript中的require、import和export
为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...
- javascript模块导入导出
第一次知道javascript有模块的概念通常都是使用<script>标签进行引入,不过只能在html文件上使用 增加的模块就如同php里的include.require可以使用引入的内容 ...
- 那些相见恨晚的 JavaScript 技巧
JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript ...
- javascript的模块发展
谨以此文记录了解js模块的过程 随着ES6的出现,js模块已经成为正式的标准了.曾经为了解决js模块问题而发展起来的民间秘籍,requireJs(AMD).SeaJs(CMD).Node(Common ...
随机推荐
- JavaScript学习笔记 - 进阶篇(3)- 流程控制语句
if语句 if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位,如果你会HTM ...
- docker可视化工具
介绍两款Docker可视化工具 DockerUI(特点:轻量) 下载镜像 docker pull abh1nav/dockerui 启动容器 docker run -d --privileged -- ...
- 通过TleChat插件一键Getshell
TleChat网站插件是一个发布到wordpress,typecho和emlog社区上的站长聊天插件,站长聊天室插件为站长和用户提供聊天室功能,让站长与用户之间的联系更加友爱,支持文本.长文本.语音聊 ...
- [GX/GZOI2019]特技飞行(扫描线+置换)
感觉是6题中最难的一题,其实这题是一个二合一: 第一问:给定平面上若干点和k个关键点,关键点覆盖一个45°倾斜的正方形范围r,求有多少点被至少一个关键点覆盖.这个可以曼哈顿转切比雪夫距离,然后再扫描线 ...
- Windows和Linux下实现ssh免密登录
------------恢复内容开始------------ SSH是一种通讯协议,可以实现远程安全登录.可以通过如putty.MobaXterm等工具通过ssh安全登录到虚拟机进行操作. Opens ...
- npm 切换成淘宝镜像
npm install nrm -g nrm use taobao
- 3)PHP的http 并发
详解浏览器最大并发连接数:http://www.iefans.net/liulanqi-zuida-bingfa-lianjieshu/ 并发连接数对浏览器加载速度的测试:http://www.ief ...
- Spring Cloud服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- The equal-likelihood model|event|experiment|probability model
5.1Probability Basics uncertainty is inherent in inferential statistics,因为总是需要样本估计总体,The science of ...
- Outlook邮件的右键菜单中添加自定义按钮
customUI代码如下: <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> ...