上个月学了 require.js

现在顺便来学学 sea.js.

对比下这两种的区别,看自己喜欢哪个,就在接下来的项目中去使用它吧.

 

seajs中的所有 JavaScript 模块都遵循 CMD 模块定义.

在 CMD 规范中,一个模块就是一个文件.

主要API有

define

define(factory);

//  define 用来定义模块  factory 可以是一个函数,也可以是一个对象或字符串.

define({"foo":"bar"});

define("This is a string.");

//  当 factory 为 函数时,表示模块的构造方法.执行该构造方法可以得到模块向外提供的接口.

//  factory 方法执行时,默认传入三个参数: require,exports 和 module;

define(function(require,exports,module){

  // 模块代码

});

//  define还能接收两个以上参数.

//  id 为 字符串,是 模块标识, deps 为 数组,是依赖的模块

//  该方式不属于 CMD 规范

define(id,[deps],function(require,exports,module){

  // 模块代码

});

define.cmd  // 用来检测是否有 CMD 模块加载器

require

//  require 是 factory 函数的第一个参数,也是一个方法.用来接收 模块标识 

require(id)

require.async(id,callback?)

//  require 是同步往下执行, require.async 是异步回调执行,一般用来加载可延迟异步加载的模块

exports

//  exports 是一个对象,用来向外提供模块接口

module

//  module 也是一个对象,存储了当前模块的一些属性和方法

 

常用的 API 有 define,require,require.async,exports,module.exports 这五种.

关于seajs的配置

seajs.config({

  //  别名配置

  alias:{

    "jquery":"./jquery"

  },

  //  require('jquery') => 加载的是 ./jquery.js

 

  //  路径配置

  paths:{

    "jquery":"./jquery"

  },

  //  require('jquery/jquery') => 加载的是 ./jquery/jquery.js

 

  //  变量配置

  vars:{

    "locale":"zh-cn"

  },

  //  require('./common/{locale}.js') => 加载的是 ./common/zh-cn.js

  

  //  映射配置

  map:[

    ['.js' , '-min.js']

  ],

  //  require('./jquery'); => 加载的是 jquery.min.js

  

  //  预加载项

  preload:[

    this.JSON ? '' : 'json'

  ],

  //  当 this.JSON 为空时,加载 json 模块

 

  //  调试模式

  debug:true,

  //  开启调试时,不会删除动态插入的 script 标签

 

  //  基础路径

  base:"./base/",

  //  文件编码

  charset:"utf-8"

});

 

//  seajs.config 可以多次运行,每次运行都会合并当前操作, 如果存在则覆盖


在项目中利用 seajs

 目录结构为 

│ .gitignore
│ gulpfile.js
│ package.json
│ README.md

├─app
│   index.html
│   seajsConfig.js

├─debug
│ └─js
│ │ main.js
│ │
│ ├─forum
│ │ detail.js
│ │ index.js
│ │ post.js
│ │
│ ├─main
│ │ index.js
│ │ str.js
│ │
│ ├─other
│ │ │ swiper-3.2.7.jquery.min.js
│ │ │
│ │ ├─jquery
│ │ │ jquery.js
│ │ │
│ │ └─seajs
│ │ sea.js
│ │
│ └─user
│ index.js
│ user.js

  app文件夹下的 index.html引用 seajs 和 入口文件

<script src="./js/other/seajs/sea.js"></script>
<script src="./seajsConfig.js"></script>

  将 seajs 一些配置写在入口文件里

if(location.href.indexOf('?dev') > 0){
	//	根据字段判断是否进入调试模式
	seajs.config({
		base:"../debug/js",
		debug:true,
	});
}else{
	//	进入发布状态
	seajs.config({
		base:"./js",
		map:[
			['.js','.min.js']
		],
	});
}

seajs.config({
	//	路径配置
	paths:{
		'user':'user',
		'forum':'forum',
		'main':'main'
	},
	//	别名配置
	alias:{
		'jquery':'other/jquery/jquery',
		'swiper':'other/swiper-3.2.7.jquery',
	}
})

seajs.use('main/index');
seajs.use('forum/index');

  debug/js/main/index.js

define(function(require){
	//	require 添加依赖
     //   依赖先加载所以先输出 str 里的 console.log var str = require('main/str'); var swi = require('swiper'); console.log('这是在 main/index 里'); console.log(str); });

  debug/js/main/str.js

define(function(require,exports,module){
	//	通过 module.exports 输出内容
	module.exports = "这是一个 STR";
	//	或者 通过 exports 暴露部分内容
	//	exports.str1 = "这是 str 1";
	//	exports.str2 = "这是 str 2";
    console.log("这是在 main/str 里"); });

   打开 index.html,将会发现依赖是已经按顺序加载并执行

 

  可以看到 js 都会按顺序加载并执行.

为什么需要打包?

  可以看到上面的例子里, 网页将会加载更多的 js 文件,造成更多的响应,反而会拖慢网站的速度.为此我们需要将其打包起来.

  本例中采用 gulp 和 gulp-seajs-pack 去打包这些js

 

'use strict';

var gulp = require('gulp');
var pack = require('gulp-seajs-pack');

gulp.task('default',function(){
	console.log('test')
});

gulp.task('seajs',function(){
	var config = {
		//	设置要打包的目录
		base:"./debug/js",
		paths:{
			'user':'user',
			'forum':'forum',
			'main':'main'
		},
		alias:{
			'jquery':'other/jquery/jquery',
			'swiper':'other/swiper-3.2.7.jquery',
		},
		output:[
			//"first/index.js"
		]
	};
	return gulp.src([
			"./debug/js/**/*.js",
			//	第三方包
			"!./debug/js/other/**/*.js"
		])
		//	选择	打包目录下的所有JS
		.pipe(pack(config))
		//	开始打包
		.pipe(gulp.dest("./app/js"));
		//	将打包后的 JS 输出到 目标目录里
});

  然后执行

$ gulp seajs

  即可完成打包.

  生成的目录如下:

├─forum

│ detail.js
│ index.js
│ post.js

├─main
│ index.js
│ str.js

└─user
index.js
user.js

  文件还是太大,先进行压缩

var rename = require('gulp-rename');
var uglify = require('gulp-uglify');

gulp.task('web-js-ug',function(){
	gulp.src([
		"./debug/js/other/**/*.js",
		"./app/js/**/*.js",
		"!./app/js/**/*.min.js",
		"!./app/js/other/**/*.js",
	])
	.pipe(gulp.dest('./app/js'))
	.pipe(uglify())
	.pipe(rename({
		extname:".min.js"
	}))
	.pipe(gulp.dest('./app/js'))
});

  执行

$ gulp web-js-ug

  再刷新  index.html 时,

这样就算打包完毕.

项目地址在 GitHub

posted on 2016-04-13 10:12  小玥光  阅读(293)  评论(0编辑  收藏  举报