[TOC]
# 写在前面:
一个文件就是一个模块。
另外本文中的示例代码需要在node.js环境中方可正常运行,否则将出现错误。事实上ES6已经出现了模块规范,如果使用ES6的模块规范是无需node.js环境的。因此,需要将commonJS规范和ES6的模块规范区分开来。
# 一、为什么制定CommonJS规范?
在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:
1. 没有模块系统
2. 标准库较少
3. 没有标准接口
4. 缺乏包管理系统
5. 列表内容
CommonJS规范的提出,主要是为了弥补JavaScript没有标准的缺陷,已达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。
# 二、CommonJS模块规范
CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识。
## 1、模块引用
如果在a.js文件中使用如下语句
```
var math=require('math');
```
意为使用require()方法,引入math模块,并赋值给变量math。事实上,命名的变量名和引入的模块名不必相同,就像这样:
```
var Math=require('math');
```
赋值的意义在于,a.js中将仅能识别Math,因为这是已经定义的变量,并不能识别math,因为math没有定义。
### 带路径和不带路径
上面例子中require的参数仅仅是模块名字的字符串,没有带有路径,引用的是a.js所在当前目录下的node_modules目录下的math模块。如果当前目录没有node_modules目录或者node_modules目录里面没有安装math模块,便会报错。
如果要引入的模块在其他路径,就需要使用到相对路径或者绝对路径,例如:
```
var add=require('./add.js')
```
上面例子中引入了当前目录下的add.js文件,并赋值给add变量。
## 2、模块定义
```
module对象:在每一个模块中,module对象代表该模块自身。
export属性:module对象的一个属性,它向外提供接口。
```
仍然采用上一个示例,假设add.js中的代码如下:
```
function add(num1,num2){
alert(num1+num2);
}
```
尽管a.js文件引入了add.js文件,前者却仍然无法使用后者中的add函数,在a.js文件中add(3,5)这样的代码会报错,提示add不是一个函数。
add.js中的函数要能被其他模块使用,就需要暴露一个对外的接口,export属性用于完成这一工作。将add.js中代码改为如下:
```
exports.add=function (num1,num2){
alert(num1+num2);
}
```
a.js文件就可以正常调用add.js中的方法,例如add.add(3,5)这样的调用能够正常执行,前一个add意为本文件中add变量代表的模块,后一个add是引入模块的add方法。
## 3、模块标识
模块标识指的是传递给require方法的参数,必须是符合小驼峰命名的字符串,或者以 . 、.. 、开头的相对路径,或者绝对路径。
# 三、CommonJS模块规范的好处
CommonJS模块规范很好地解决变量污染问题,每个模块具有独立空间,互不干扰,命名空间等方案与之相比相形见绌。
CommonJS规范定义模块十分简单,接口十分简洁。
CommonJS模块规范支持引入和导出功能,这样可以顺畅地连接各个模块,实现彼此间的依赖关系。
- 前言
- CSS
- VUE
- Vue.js 安装
- Vue.js 目录结构
- Vue.js 起步
- Vue.js 模板语法
- Vue.js 条件与循环
- Vue.js 循环语句
- Vue.js 计算属性
- Vue.js 监听属性
- Vue.js 样式绑定
- Vue.js 事件处理器
- Vue.js 表单
- Vue.js 组件
- Vue.js 自定义指令
- Vue.js 路由
- React
- 安装
- React JSX
- React 组件
- 问题1
- React state
- React Props
- React 组件 API
- React 组件生命周期
- React AJAX
- React 表单与事件
- React Refs
- Babel
- Ant Design
- 安装
- 快速上手
- webpack
- 安装
- JavaScript
- 知识点
- 字符转数字
- js中字符串全部替换
- 函数
- reduce() 方法
- UI控件
- DataTable
- 语言配置 选项
- 增加行
- 列渲染-自定义列
- 创建行回调-操作行
- 自定义数据长度
- 默认设置
- 样式
- 集成Bootstrap 3
- 分页相关
- 数据
- NodeJs
- Electron
- 打包
- 介绍
- 知识点
- 使用 jquery
- CommonJS规范
- Bower
- 简介
- 安装
- Swing
- Swing界面组件
- JComboBox
- JDesktopPane和JInternalFrame
- JFrame
- JTabbedPane
- JTable
- JProgressBar
- JToolBar
- 知识点
- 截取log4j日志并输出到GUI组件
- JFrame 居中显示
- Swing中三种最大化初始窗口的方法
- Layout布局
- BorderLayout
- GridBagLayout
- GridLayout
- BoxLayout
- JxBrowser
- 浏览器引擎-Browser Engine
- 创建浏览器-Creating Browser
- 创建隐身浏览器-Creating Incognito Browser
- 存储用户数据-Storing User Data
- 处理浏览器-Disposing Browser
- 浏览器偏好-Browser Preferences
- 恢复浏览器-Restoring Browser
- 渲染流程事件-Render Process Events
- 渲染进程ID-Render Process ID
- 获取帧ID-Getting Frame IDs
- 获取产品版本-Getting Product Version
- 寻找文本-Finding Text
- 清除缓存-Clearing Cache
- 转发键盘事件-Forwarding Key Events
- 转发鼠标事件-Forwarding Mouse Events
- 加载内容-Loading Content
- 加载网址-Loading URL
- 使用POST加载URL-Loading URL with POST
- 加载HTML-Loading HTML
- 从JAR加载HTML-Loading HTML from JAR
- 获取HTML-Getting HTML
- 获取选定的HTML-Getting Selected HTML
- 加载事件-Loading Events
- 正在加载和等待-Loading & Waiting
- 显示PDF-Displaying PDF
- 网络活动-Network Events
- 处理资源加载-Handling Resources Loading
- 启用/禁用退格导航-Enabling/Disabling Backspace Navigation
- 处理SSL证书错误-Handling SSL Certificate Errors
- SSL证书验证程序-SSL Certificate Verifier
- 导航历史-Navigation History
- User-Agent
- WebSockets
- 处理加载-Handling Loading
- 修改POST / PUT / PATCH上传数据-Modifying POST/PUT/PATCH Upload Data
- HTML5本地和会话存储-HTML5 Local & Session storages
- 访问HTTP响应数据-Accessing HTTP response data
- HTTP服务器白名单-HTTP Server Whitelist
- 自定义协议处理程序-Custom Protocol Handler
- ActiveX
- 浏览器视图-Browser View
- 轻量级或重量级-Lightweight or Heavyweight
- 在Swing中使用JxBrowser-Using JxBrowser in Swing
- 在JavaFX中使用JxBrowser-Using JxBrowser in JavaFX
- 在SWT中使用JxBrowser-Using JxBrowser in SWT
- 自定义CSS光标-Custom CSS Cursors
- 标题事件-Title Events
- 状态事件-Status Events
- 键盘和鼠标事件-Keyboard & Mouse Events
- 处理键盘事件-Handling Keyboard Events
- 处理鼠标事件-Handling Mouse Events
- 编辑器命令-Editor Commands
- 拖放-Drag & Drop
- 内容缩放-Content scaling
- 上下文菜单-Context Menu
- JMenuBar
- JInternalFrame
- JTabbedPane
- JPanel
- 加速轻量级渲染-Accelerated Lightweight Rendering
- 透明背景-Transparent Background
- DOM
- 使用文档-Working with Document
- 注入css-Injecting CSS
- 寻找元素-Finding Elements
- 元素属性-Element Attributes
- 创建元素和文本节点-Creating Element & Text Node
- 设置节点值-Setting Node Value
- Select & Option Elements
- 选择CheckBox-Selecting CheckBox
- Getting Selected Text
- 模拟点击-Simulating Click
- DOM事件
- XPath
- 查询选择器-Query Selector
- 使用表单-Working with Form
- 滚动文档-Scrolling Document
- 在Point处查找节点-Finding Node at Point
- 获得元素界限-Getting Element Bounds
- 监听内容变化-Listening to the Сontent Сhanges
- 模拟DOM事件-Simulating DOM Events
- Audio & Video
- MP3/MP4/H.264
- 网络摄像头和麦克风-Web Camera & Microphone
- 全屏视频-Full Screen Video
- 静音音频-Muting Audio
- HTML5 Video
- Pop-ups
- 关于弹出窗口-About Pop-ups
- 在swing中处理弹出窗口-Handling Pop-ups Swing
- 在JavaFX中处理弹出窗口-Handling Pop-ups JavaFX
- Dialogs
- JavaScript对话框-JavaScript Dialogs
- 文件下载-File Download
- 上传文件-File Upload
- 选择SSL证书-Select SSL Certificate
- 选择自定义SSL证书-Select Custom SSL Certificate
- 卸载前-Before Unload
- 颜色选择器-Color Chooser
- Proxy
- 使用代理-Working with Proxy
- 系统代理设置-System Proxy Settings
- Authentication
- 处理代理验证-Handling Proxy Authentication
- 处理基本,摘要和NTLM身份验证-Handling Basic, Digest and NTLM Authentication
- JavaScript Java Bridge
- 从Java调用JavaScript-Calling JavaScript from Java
- 从JavaScript调用Java-Calling Java from JavaScript
- 控制台消息-Console Messages
- 使用JSON-Working with JSON
- 使用jQuery-Working with jQuery
- 使用ScriptContext-Working with ScriptContext
- 将表单数据发送到Java-Sending Form Data to Java
- 使用数组-Working with Arrays
- @JSAccessible
- Plugins
- Printing
- Cookies
- Saving Web Page
- Zoom
- Integration
- Deploying
- Chromium
- Spell Checker
- Debugging
- Why JxBrowser
- Tips & Tricks
- 基础知识
- AbstractAction
- Void
- SwingWorker应用详解
- JAVA实现国际化
- UIManager
- AppJS
- heX
- bootstrap
- 知识点
- 空行
- Eclipse RCP
- Eclipse e4 概览