`
zccst
  • 浏览: 3320070 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

seajs压缩打包过程

 
阅读更多
作者:zccst

一、构建过程
CMD 模块在构建时,有两个基本操作:
1,提取操作,用来提取模块的标识 id 和依赖 dependencies。
2,压缩操作。经过上面的提取操作后,构建工具就可以调用任何 JS 压缩工具来进行压缩了,require 参数也可以被压缩成任意字符。

举例,在a.js
define(function(require, exports) {
  var b = require('./b');
  var c = require('./c');
});

//代码将改为
define('xxx/1.0.0/a', ['./b', './c'], function(require, exports) {
  var b = require('./b');
  var c = require('./c');
});


Sea.js 在运行 define 时,接受 factory 参数,可以通过 factory.toString() 拿到源码,再通过正则匹配 require 的方式来得到依赖信息。依赖信息是一个数组,比如上面 a.js 的依赖数组是:['./b', './c']


Sea.js 不需要通过 factory.toString() 和正则匹配的方式来获取依赖,直接从第二个参数中就可以拿到依赖数组。


二、ID 和路径匹配原则
所谓 ID 和路径匹配原则 是指,使用 seajs.use 或 require 进行引用的文件,如果是具名模块(即定义了 ID 的模块),会把 ID 和 seajs.use 的路径名进行匹配,如果一致,则正确执行模块返回结果。反之,则返回 null。

例如:
// 文件路径是 lib/jquery.js
// ID 和实际路径匹配了(.js 后缀会自动补上)
define('lib/jquery', function(require, exports, module) {
    // jquery code
    exports = $;
});

//当 jQuery 文件是上面的情况时,下面的变量 $ 能拿到正确的返回结果。

//使用 seajs.use
seajs.use('lib/jquery', function($) {
    // use $
});
//或者在模块中 require :
define(function(require, exports, module) {
    var $ = require('$');
    // use $
});


下面这种情况会返回null

// 文件路径是 lib/jquery.js
// 但是 ID 是 lib/jquery.min.js
// ID 和路径不匹配
define('lib/jquery.min', function(require, exports, module) {
    // jquery code
    exports = $;
});

而匿名模块始终能正确返回结果:
// lib/jquery.js
// 匿名模块,不需要进行匹配
// 但是文件中只能有一个 define 块
define(function(require, exports, module) {
    // jquery code
    exports = $;
});
注意这里用于匹配的 ID 都是经过 alias 和 path 解析并且补完后缀之后的。


为什么要有这个原则

回答这个问题前,请先阅读这篇文章:#426 。

首先,Sea.js 的模块启动接口秉承的是路径即 ID 的设计原则。seajs.use 的方法的第一个参数被规定为文件路径(而不是 ID),这样的设计减轻了记忆模块 ID 的负担,无论是匿名模块还是具名模块,开发者只需要知道文件放在哪儿就行了。

进一步的,之所以有这个 ID 和路径匹配原则,是因为在 CMD 的书写规范中,一个文件对应一个模块,所有的模块都是匿名模块(即 define(factory) 的形式)。那么当 seajs.use 某模块时,这个模块对应的文件里的唯一的 define 方法理所当然的是这个模块的执行代码,这时可以正确返回结果。


三、自动压缩工具


普通压缩工具
针对IE浏览器,要自己写ID


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    seajs模块压缩问题与解决方法实例分析

    在使用seajs进行前端模块开发时,一个常见的问题是模块压缩和打包问题,尤其是当我们将代码压缩后,一些特殊的关键字可能会被压缩工具改变,导致模块无法被正确加载。本文将详细介绍seajs模块压缩问题与解决方法,并...

    前端开源库-grunt-react-seajs

    使用"grunt-react-seajs"的过程通常包括以下步骤: 1. **安装Grunt和Grunt插件**:确保你已经安装了Node.js,然后通过npm(Node.js包管理器)全局安装Grunt CLI(命令行接口),接着在项目根目录下安装Grunt和...

    基于gulp合并压缩Seajs模块的方式说明

    虽然在npm上并没有特别流行的专门用来做Sea.js模块合并压缩的gulp插件,但gulp-seajs-transport和gulp-seajs-concat这两个插件可以解决这个问题。gulp-seajs-transport插件用于在gulp流程中处理Sea.js的模块依赖和...

    gulp构建seajs模块案列

    5. **运行任务**:在命令行中输入`gulp`,执行默认任务,`gulp-cmd-pack`就会开始工作,将Seajs模块打包成一个或多个优化过的文件。 通过以上步骤,我们可以有效地管理和优化Seajs模块,使得在开发过程中可以专注于...

    seajs_master.zip

    6. **构建流程**:Seajs的开发和发布通常会涉及`Grunt`或`Gulp`这样的构建工具,它们负责压缩、合并、混淆源码,生成适用于生产环境的版本。 7. **社区和生态系统**:Seajs拥有丰富的社区资源,包括插件库、教程、...

    SPM v.1.1.2 With SeaJS

    在SPM环境中,开发者可以使用SeaJS的模块语法编写代码,SPM则负责处理模块间的依赖关系,将各个模块打包成一个或多个可部署的静态资源文件。这降低了项目构建的复杂性,提高了开发效率。 **4. 使用步骤** - **安装...

    JavaScript模块化开发库之SeaJS

    - SeaJS提供了丰富的插件系统,如seajs-combo用于合并压缩代码,seajs-text用于加载文本资源等,这些工具可以帮助开发者提高开发效率,优化生产环境的性能。 - 使用SeaJS时,可以结合构建工具(如Gulp、Webpack等...

    前端开源库-fis3-prepackager-seajs-combine

    **前端开源库——FIS3预打包程序seajs-combine** 在前端开发中,模块化是提高代码可维护性和复用性的重要手段。Seajs是一款轻量级的JavaScript模块加载器,它借鉴了CommonJS规范,使前端开发也能享受到类似于Node....

    前端开源库-grunt-react-seajs.zip

    在实际项目中,我们可以通过配置grunt-react-seajs来定制自己的构建流程,例如设置源代码目录、输出目录,以及决定哪些文件需要被编译和打包。这样,开发者就能专注于编写业务逻辑,而无需关心底层的构建细节。 ...

    seajs-project:基于seajs模块化的合并压缩方案

    基于seajs模块化的合并压缩###合并压缩前--Gruntfile.js--打包脚本--pagekage.json--依赖的npm配置--node-modules/--下载的npm--app/ //存放页面--src/ //打包前目录------seaConfig.js //Seajs配置文件------page/ ...

    grunt构建基于seajs的网站实现

    - `grunt-seajs-combo`:专门针对Sea.js的插件,可以合并并压缩Sea.js模块。 6. **目录结构**: 文件名称列表中的`index.html`通常是项目的入口文件,`Gruntfile.js`存放自动化任务配置,`node_modules`存储Grunt...

    seajs-transport-demo:seajs 传输的演示

    2. **模块打包**:Seajs 使用的模块打包工具会将依赖关系分析并整合到一个或多个文件中,便于浏览器加载。 3. **压缩优化**:为了提高页面加载速度,通常会对输出的 JavaScript 和 CSS 进行压缩,去除不必要的空白和...

    JavaScript 模块化开发实例详解【seajs、requirejs库使用】

    3. **优化和打包**:RequireJS提供工具进行模块的合并和压缩,方便生产环境使用。 模块化开发的其他常见方式还包括CommonJS(Node.js中使用)和ES6的`import/export`语法。虽然浏览器原生不支持ES6模块,但可以通过...

    klcs:客户端工具函数集合库,针对工作中在客户端环境,需要用到的常用需求进行了封装,需要undescore,jQuery的配合只兼容chrome以及IE8以上浏览器,省去多次提取,或者编写函数导致的重复劳动。如提取cookie,以及提取链接参数的字符串,兼容了requireJS与seaJS的打包

    方法:借鉴底线库的工具框架,包含一些常用方法,在兼容AMD模式的同时,兼顾了CMD# 下载依赖$ npm install# 开发环境(开启本地热服务)$ npm run start# 生产环境(输出压缩后代码)$ npm run product博客日期2016-10-18...

    myspm:spm 标准构建 seajs 项目

    4. **构建与打包**:使用`myspm build`命令,myspm会根据配置将项目中的模块打包成生产环境可用的格式,通常包括合并、压缩、混淆等优化步骤。生成的文件通常位于dist目录下,可以直接部署到服务器。 5. **模块依赖...

    gulp-sea-build:用于包 seajs 模块的 gulp 插件

    `gulp-sea-build` 提供了一系列配置选项,允许用户根据项目需求定制打包过程,例如: - `entry`: 入口文件,通常是配置模块的 `seajs-config.js`。 - `output`: 输出目录,打包后的文件将保存在这里。 - `modules`:...

    angularseajs

    在实际开发过程中,开发者可能会编写自动化脚本来整合AngularJS和SeaJS,例如通过Grunt或Gulp自动编译、打包和压缩代码。 至于压缩包中的“AngularSeaJS”文件,它可能是一个示例项目或者一个自定义的库,包含了...

    0223seaJSrequireJSDemo

    2. **优化工具**:Require.js 配合 r.js 工具,可以对整个项目进行打包压缩,优化生产环境的性能。 3. **模块定义与加载**:通过 `define` 函数定义模块,使用 `require` 加载模块。`require` 可以接受配置对象和回...

    wit_workflow:微智2014前端开发工作流

    2、前端资源的压缩和打包,太繁杂,又要压缩js,又要压缩css,还要压缩图片。 3、如果项目太大,如何形成良好的团队开发模式。 解决模块化问题 1、使用seajs模块化开发js 遵循CMD规范,书写规则类似与nodejs,关于的...

Global site tag (gtag.js) - Google Analytics