上个月学了 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

sea.js 入门的更多相关文章

  1. Sea.js入门

    本文只是seajs的入门贴.要详细了解,请看GitHub主页上的相关链接,精彩不断,精选几篇: 前端模块化开发的价值 前端模块化开发的历史 ID和路径匹配原则 与RequireJS的异同 模块的加载启 ...

  2. Sea.Js使用入门

    1.Sea.Js是什么 seajs相对于RequireJs与LabJS就比较年轻,2010年玉伯发起了这个开源项目,SeaJS遵循CMD规范,与RequireJS类似,同样做为模块加载器.示例 // ...

  3. sea.js 个人入门

    玉伯 : http://seajs.org/docs/ 说这两个JS 必须提到AMD.commonjs两种不同的规范: 奇舞团:http://www.75team.com/archives/882 知 ...

  4. 深入学习sea.js

    入门学习了文档之后,在深入学习里面的一些有趣的知识点 =================================== 一.配置 seajs.config({ alias:( a3:'./js/ ...

  5. sea.js模块化编程

    * 为什么要模块化? 解决文件依赖 解决命名冲突 ; var var2 = 2; function fn1(){ } function fn2(){ } return { fn1: fn1, fn2: ...

  6. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  7. 解决sea.js引用jQuery提示$ is not a function的问题

    在使用sea.js的如下写法引用jQuery文件时, //main.jsdefine(function(require,exports,module){ var $ = require('jquery ...

  8. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  9. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

随机推荐

  1. log4j.properties 详解与配置步骤

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  2. 解决“动软代码生成器在SqlServer中会将唯一索引识别为主键"的Bug

    动软代码生成器在SqlServer中,生成的代码会将唯一索引错误地识别为主键, 反编译源代码后,发现其中的SQL条件有误,现修复此Bug. 修复方法:将附件中的”Maticsoft.DbObjects ...

  3. Gulp安装及配合组件构建前端开发一体化

    原文:http://www.dbpoo.com/getting-started-with-gulp/ 所有功能前提需要安装nodejs(本人安装版本v0.10.26)和ruby(本人安装版本1.9.3 ...

  4. Java借助Runtime调用外部程序阻塞的代码

    有时候在java代码中会调用一些外部程序,比如SwfTools来转换swf.ffmpeg来转换视频等.如果你的代码这样写:Runtime.getRuntime().exec(command),会发现程 ...

  5. Javascript 技巧集(1)

    1. 数组克隆, 使用 slice() 方法 var a1 = [1,2,3,4]; var a2 = a1.slice(); 2. 强制将变量值转化为 bool 类型,前置双感叹号 !! var a ...

  6. .Net Enum

    /// <summary> /// 将enum转换成List<Model.Models.SelectViewModels>,即html的select标签使用的数据 /// &l ...

  7. 【解决】putty使用从AWS下载的private key登录失败

    在AWS启动一个实例时如果创建并下载了一个KeyPair的私钥(*.pem),则可以此私钥作为Credentials通过putty远程登录到这个实例系统.但在实际操作中,用putty登录时会提示如下错 ...

  8. day9-paramiko

    一.基于用户名密码认证SSH连接 #!/usr/bin/env python #coding:utf8 import paramiko ssh = paramiko.SSHClient()#创建SSH ...

  9. 从头开始学算法--NUM operation in MIX

    从前往后,按照课本顺序刚刚看到MIX这部分.NUM是一个转换操作符,可以把字符编码转换为数字.它把registerA & registerX的值转换为数字并赋值给registerA.转换过程是 ...

  10. Linux安装MySql.Data for mono

    wget http://dev.mysql.com/get/Downloads/Connector-Net/mysql-connector-net-6.8.3-noinstall.zipunzip m ...