作者: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模块压缩问题与解决方法,并...
使用"grunt-react-seajs"的过程通常包括以下步骤: 1. **安装Grunt和Grunt插件**:确保你已经安装了Node.js,然后通过npm(Node.js包管理器)全局安装Grunt CLI(命令行接口),接着在项目根目录下安装Grunt和...
虽然在npm上并没有特别流行的专门用来做Sea.js模块合并压缩的gulp插件,但gulp-seajs-transport和gulp-seajs-concat这两个插件可以解决这个问题。gulp-seajs-transport插件用于在gulp流程中处理Sea.js的模块依赖和...
5. **运行任务**:在命令行中输入`gulp`,执行默认任务,`gulp-cmd-pack`就会开始工作,将Seajs模块打包成一个或多个优化过的文件。 通过以上步骤,我们可以有效地管理和优化Seajs模块,使得在开发过程中可以专注于...
6. **构建流程**:Seajs的开发和发布通常会涉及`Grunt`或`Gulp`这样的构建工具,它们负责压缩、合并、混淆源码,生成适用于生产环境的版本。 7. **社区和生态系统**:Seajs拥有丰富的社区资源,包括插件库、教程、...
在SPM环境中,开发者可以使用SeaJS的模块语法编写代码,SPM则负责处理模块间的依赖关系,将各个模块打包成一个或多个可部署的静态资源文件。这降低了项目构建的复杂性,提高了开发效率。 **4. 使用步骤** - **安装...
- SeaJS提供了丰富的插件系统,如seajs-combo用于合并压缩代码,seajs-text用于加载文本资源等,这些工具可以帮助开发者提高开发效率,优化生产环境的性能。 - 使用SeaJS时,可以结合构建工具(如Gulp、Webpack等...
**前端开源库——FIS3预打包程序seajs-combine** 在前端开发中,模块化是提高代码可维护性和复用性的重要手段。Seajs是一款轻量级的JavaScript模块加载器,它借鉴了CommonJS规范,使前端开发也能享受到类似于Node....
在实际项目中,我们可以通过配置grunt-react-seajs来定制自己的构建流程,例如设置源代码目录、输出目录,以及决定哪些文件需要被编译和打包。这样,开发者就能专注于编写业务逻辑,而无需关心底层的构建细节。 ...
基于seajs模块化的合并压缩###合并压缩前--Gruntfile.js--打包脚本--pagekage.json--依赖的npm配置--node-modules/--下载的npm--app/ //存放页面--src/ //打包前目录------seaConfig.js //Seajs配置文件------page/ ...
- `grunt-seajs-combo`:专门针对Sea.js的插件,可以合并并压缩Sea.js模块。 6. **目录结构**: 文件名称列表中的`index.html`通常是项目的入口文件,`Gruntfile.js`存放自动化任务配置,`node_modules`存储Grunt...
2. **模块打包**:Seajs 使用的模块打包工具会将依赖关系分析并整合到一个或多个文件中,便于浏览器加载。 3. **压缩优化**:为了提高页面加载速度,通常会对输出的 JavaScript 和 CSS 进行压缩,去除不必要的空白和...
3. **优化和打包**:RequireJS提供工具进行模块的合并和压缩,方便生产环境使用。 模块化开发的其他常见方式还包括CommonJS(Node.js中使用)和ES6的`import/export`语法。虽然浏览器原生不支持ES6模块,但可以通过...
方法:借鉴底线库的工具框架,包含一些常用方法,在兼容AMD模式的同时,兼顾了CMD# 下载依赖$ npm install# 开发环境(开启本地热服务)$ npm run start# 生产环境(输出压缩后代码)$ npm run product博客日期2016-10-18...
4. **构建与打包**:使用`myspm build`命令,myspm会根据配置将项目中的模块打包成生产环境可用的格式,通常包括合并、压缩、混淆等优化步骤。生成的文件通常位于dist目录下,可以直接部署到服务器。 5. **模块依赖...
`gulp-sea-build` 提供了一系列配置选项,允许用户根据项目需求定制打包过程,例如: - `entry`: 入口文件,通常是配置模块的 `seajs-config.js`。 - `output`: 输出目录,打包后的文件将保存在这里。 - `modules`:...
在实际开发过程中,开发者可能会编写自动化脚本来整合AngularJS和SeaJS,例如通过Grunt或Gulp自动编译、打包和压缩代码。 至于压缩包中的“AngularSeaJS”文件,它可能是一个示例项目或者一个自定义的库,包含了...
2. **优化工具**:Require.js 配合 r.js 工具,可以对整个项目进行打包压缩,优化生产环境的性能。 3. **模块定义与加载**:通过 `define` 函数定义模块,使用 `require` 加载模块。`require` 可以接受配置对象和回...
2、前端资源的压缩和打包,太繁杂,又要压缩js,又要压缩css,还要压缩图片。 3、如果项目太大,如何形成良好的团队开发模式。 解决模块化问题 1、使用seajs模块化开发js 遵循CMD规范,书写规则类似与nodejs,关于的...