理解
模块化规范
CommonJS
规范
- 说明
- 基本语法
- 暴露模块
- module.exports = value
- exports.xxx = value
- 问题:暴露的模块到底是什么?exports对象
- 引入模块
- require(xxx)
- 第三方模块:xxx为模块名
- 自定义模块:xxx为模块文件路径
实现
- 服务器端实现
- 浏览器端实现
- 区别Node与Browserify
Node.js模块化教程
|-modules
|-module1.js
|-module2.js
|-module3.js
|-app.js
|-package.json
{
"name":"commonJS-node",
"version":"1.0.0"
}
- 下载第三方模块
npm install uniq --save
- 模块化代码
module.exports = {
msg:'module1',
foo(){
console.log(this.msg);
}
};
module.exports = function(){
console.log('module2');
};
exports.foo = function(){
console.log('foo() module3');
}
exports.bar = function(){
console.log('bar() module3');
}
exports.arr = [1,5,6,8,2,3,6,3,11];
let module1 = require('./modules/module1');
let module2 = require('./modules/module2');
let module3 = require('./modules/module3');
let uniq = require('uniq');
module1.foo();
module2();
module3.foo();
module3.bar();
console.log(uniq(module3.arr));
Browserify模块化使用教程
|-js
|-dist
|-src
|-module1.js
|-module2.js
|-module3.js
|-app.js
|-index.html
|-package.json
{
"name":"browerify-test",
"version":"1.0.0"
}
- 下载browerify
- 全局:npm install browerify -g
- 局部:npm install browserif --save -dev
- 定义模块代码
module.exports = {
foo(){
console.log('module1 foo()');
}
}
module.exports = function(){
console.log('module2()');
}
exports.foo = function(){
console.log('module3 foo()');
}
exports.bar = function(){
console.log('module3 bar()');
}
let module1 = require('./module1');
let module2 = require('./module2');
let module3 = require('./module3');
module1.foo();
module2();
module3.foo();
module3.bar();
- 打包处理js
- browserify js/src/app.js -o js/dist/bundle.js
- 页面引入
<script type="text/javascript" src="./js/dist/bundle.js"></script>
AMD
规范
- 说明
- 基本语法
define(function(){
return 模块;
})
define(['module1'],'module2'],function(m1,m2){
return 模块;
})
require(['module1','module2'],function(m1,m2){
使用m1,m2
})
实现(浏览器端)
NoAMD
(function(window){
let name = 'dataService.js';
function getName(){
return name;
}
window.dataService = {getName}
})(window)
(function(windw){
leet msg = 'alerter.js';
function showMsg(){
console.log(msg,dataService.getName());
}
window.alerter = {showMsg};
})(window,dataService)
Require.js 使用教程
|-js
|-libs
|-require.js
|-modules
|-alerter.js
|-dataService.js
|-main.js
|-index.html
- 定义require.js的模块代码
- dadtaService.js
define(function(){
let name = 'dataService.js';
function getName(){
return name;
}
return {getName};
})
define(['dataService'],function(dataService){
let msg = 'alerter.js';
function showMsg (){
console.log(msg,dataService.getName());
}
return {showMsg}
});
(function(){
requirejs.config({
baseUrl:'js/', //基本路径,出发点在根目录下
paths:{ //配置路径
dataService:'./modules/dataService',
alerter:'./modules/alerter',
jquery:'./libs/jquery-1.10.1',
angular:'./libs/angular'
},
shim:{
angular:{
exports:'angular'
}
}
});
requirejs(['alerter'],function(alerter){
alerter.showMsg();
});
})();
<script data-main="js/main.js" src="js/libs/require.js"></script>
CMD
规范
说明
基本语法
- 定义模块
define(function(require,exports,module){
exports.xxx = value
module.exports = value
})
define(function(require,exports,module){
var module2 = require('./modulel2');
require.async('./module3',function(m3){
})
exports.xxx = value
})
- 引入使用模块
define(function(require){
var m1 = require('./module1')
var m4 = require('./module4')
m1.show()
m4.show()
})
实现(浏览器端)
sea.js简单使用教程
|-js
|-libs
|-sea.js
|-modules
|-module1.js
|-module2.js
|-module3.js
|-module4.js
|-main.js
|-index.html
- 定义sea.js的模块代码
define(function(require,exprots,module){
let msg = 'module1';
function foo(){
return msg;
}
module.exports = {foo};
})
define(function(require,exprots,module){
let msg = 'module2';
function bar(){
console.log(msg);
}
module.exports = bar;
})
define(function(require,exprots,module){
let data = 'module3';
function fun(){
console.log(daga);
}
exports.module3 = {fun};
})
define(function(require,exprots,module){
let msg = 'module4';
let module2 = require('./module2');
module2();
require.async('./module3',function(module3){
module3.module3.fun();
})
funtion fun2(){
console.log(msg);
}
exports.fun2 = fun2;
})
define(function(require){
let module1 = require('./module1')
module1.foo()
let module4 = require('./module4')
module4.fun2()
})
<script type='text/javascript' src = 'js/libs/sea.js'></scritp>
<script type='text/javascritp'>
seajs.use('./js/modules/main.js')
</script>
ES6
规范
说明
语法
实现(浏览器端)
- 使用Babe将ES6编译为ES5代码
- 使用Browerify编译打包js
ES6-babel-Browerify使用教程
{
"name": "es6_babel-browerify",
"version": "1.0.0"
}
- 安装balel-cli,babel-preset-es2015和browserify //cli:command line interface
- npm install babel-cli browserify -g
- npm install babel-preset-es2015 --save-dev
- preset 预设(将es6转换成es5的所有插件打包)
- 定义 .babelrc文件(run control)
{
"presets":["es2015"]
}
- 编码
export function foo(){
console.log('moudle1 foo()');
}
export function bar(){
console.log('bar() moudle1');
}
export let arr = [1,2,3,4,5,6];
function fun(){
console.log('fun() moudle2');
}
function fun2(){
console.log('fun2() moudle2');
}
export {fun,fun2};
export default {
msg:'默认暴露';
foo(){
console.log(this.msg);
}
}
import {foo,bar} moudle1 from './module1';
import {fun,fun2} moudle2 from './module2';
import module3 from './module3';
- 编译
- 使用Babel将ES6编译为ES5代码(但包含CommonJS语法):babel js/src -d js/lib
- 使用Browserify编译js: browserify js/lib/main.js -o js/lib/bundle.js
- 页面引入
<script type="text/javascript" src="js/lib/bundle.js"</script>