上个月学了 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. tar 命令详解

    tar命令[root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 -C 目标目录(注:解压时)参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个 ...

  2. c#操作access,update语句不执行的解决办法

    update access数据库时,使用了参数化的方式,结果不报错,但是数据也没有更新.后来发现access使用参数化时,参数位置必须和赋值顺序相同才行,否则更新时就会出现数据无法更新但是也不报错的怪 ...

  3. 学习taobao框架

    参考:https://github.com/xulingbo/xulingbo.github.io/issues http://blog.csdn.net/hguisu/article/details ...

  4. HTML JavaScripts

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  5. visual studio 调试时遇到 System.BadImageFormatException

    System.BadImageFormatException”类型的未经处理的异常在 未知模块. 中发生 其他信息: 未能加载文件或程序集“SendYourIP.exe”或它的某一个依赖项.生成此程序 ...

  6. 【maven】之配置开发,测试,正式环境pom.xml文件

    在进行web程序开发,如果项目组没有使用自动化发布工具(jenkins + maven + svn + tomcat ),我们一般会使用maven的热部署来完成发布,在部署的过程中我们开发,测试,生产 ...

  7. 并发-Java中的Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  8. Bugtags 创业一年总结

    出发 在经历过了多轮的 APP 开发/测试/上线/运营周期之后,我们觉得 APP Bug 反馈环节始终十分低效,我们要来改变一下这个状态.于是有了 bugtags.com. 一年 从去年六月正式立项, ...

  9. 尚学堂Spring视频教程(三):Spring Core中的其他特性

    集合装配   如果bean中有一些集合属性,配置文件的配置如下 package com.bjsxt.dao.impl; import java.util.List; import java.util. ...

  10. JQuery 在循环中设置事件,最后一个覆盖了前面所有的设置

    function setValidation() {         for (i = 0; i < alValidations.length; i++) { //alValidations是一 ...