Javascript模块化编程(三):模块化编程实战,试用SeaJS

文章源自:http://www.diguage.com/archives/82.html

Javascript模块化编程(三):模块化编程实战,试用SeaJS

       前段时间转载了阮一峰老师的两篇讲解Javascript模块化编程的文章:“JavaScript模块化编程(一):模块原型和理论概念详解”,介绍了Javascript模块原型和理论概念;Javascript模块化编程(二):模块化编程实战,require.js详解,介绍了在实战中,如何利用RequireJS库,进行模块化编程。

  在这两篇文章发布出来之后,在和网友的交流讨论中,了解到了SeaJS,这个由国人玉伯自己创建的模块化编程库。然后,我就想学习学习,再写篇文章给大家介绍一下。

背景介绍

  官网的资料是最靠谱的。在SeaJS的官网上发现,有一个“5分钟上手SeaJS”的例子,然后就从这个例子的开始学习。不过,只看明白了个六六七七。我没看明白和我平时的JavaScript编程有啥区别。另外,我没有动手实践,心里面不踏实。所以,动手写个程序,玩味一下。后来,就想到了“猜手机号游戏”!

  由于官网已经有使用SeaJS的教程,我就不重复这方面的工作了,而且我也觉得我我肯定没有官网写的好。由于我不清楚,使用SeaJS进行“模块化编程”和我平时不进行“模块化编程”的区别。所以,我准备从另外一个角度来介绍SeaJS:将一个没有进行模块化编程的程序,改造成使用SeaJS进行“模块化编程”的程序。由于这个想法的跨度比较大,信息量也比较多。所以我把我的想法组织成了三篇文章:第一篇文章,“给哥三十五次机会,哥就能猜中你的手机号”,通过一个小游戏,来吸引大家的兴趣;第二篇,“‘猜手机号游戏’的源码分析:二分查找+面向对象”,来讲解在没有进行模块化编程时,程序的实现细节;然后,这是第三篇,在没有进行模块化编程的基础上,将原来的程序改造成一个使用SeaJS进行模块化编程的例子。

  在阅读这篇文章之前,请阅读前两篇,尤其是“‘猜手机号游戏’的源码分析:二分查找+面向对象”。同时,还建议阅读一下“JavaScript模块化编程(一):模块原型和理论概念详解”和Javascript模块化编程(二):模块化编程实战,require.js详解,规范、系统一下关于Javascript模块化编程的知识。

 

CMD模块定义规范介绍

  想享受模块化编程带来的良好封装,就必须遵循模块化编程的规范。在 SeaJS 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 规范。该规范确定了模块的基本书写格式和基本交互方式。所以,使用SeaJS之前,必须阅读一下SeaJS所要求遵循的规范。

  鉴于规范覆盖的东西比较多,看多了头大。所以,我把这个规范提炼简化一下,只关注我们需要用到的。至于,更详细的CMD模块定义规范,等先把例子跑通,理解了整个流程,然后再回头看规范,梳理、规范这部分知识。

  在介绍简化版规范之前,D瓜哥提两个也许大家都回“纳闷”的问题:

  1. 如何定义模块?
  2. 如何获取外部依赖的模块?

  CMD模块定义规范中的主要内容正是回答这两个问题。下面请看经D瓜哥简化的规范如下:

  1. 定义、封装模块的方法。(CMD模块定义规范中有好多定义方法。简单起见,目前只考虑使用如下这一种方式。)如下:
define(function(require, exports, module) {

	// The module code goes here

});

 

这里需要特别说明一下,向参数传递的三个参数名必须按照代码所示中那样写,不能简写,或者使用其他字符串代替;同时,在函数 内,exports不能被改写成其他值;可以把exports看成对象添加属性,如exports.key,然后对其复制,又如exports.key = “dValue”。

  1. 对外提供模块接口。在上一步中,我们在函数内定义了模块,但是这是在函数内定义的,在函数外部不容易访问到。该怎么向外提供模块接口呢?定义方法如下:
define(function(require, exports, module) {
  
  // 实用这种方式向外提供模块接口
  module.exports = {
    foo: 'bar',
    doSomething: function() {};
  };
  
  // 或者。由于,D瓜哥将模块封装成了一个对象,所以,本例中,使用这个方式。
  module.exports = yourFunctionName;
  
});

 

传给 factory 构造方法(就是define(function(){})方法参数中那个函数,称为factory。函数只是factory的一种形式,其他形式以后再补 充。)的 exports 参数是 module.exports 对象的一个引用。只通过 exports 参数来提供接口,有时无法满足开发者的所有需求。 比如当模块的接口是某个类的实例时,需要通过 module.exports 来实现。D瓜哥这里就是一个对象,所以只能使用module.exports 。

  1. 获取外部依赖模块。模块定义要了,需要使用的时候,就可以使用require函数获取外部依赖。具体代码如下:
define(function(require, exports, module) {

  // 使用require函数获取外部依赖
  var a = require('./a');
  a.doSomething();

});

 require函数的参数是a.js文件的相对路径。后缀名可以省略,在SeaJS加载模块的时候会自动加上的。另外,这里可以执行回调函数。不过,我们的任务是跑起来。因为不需要回调函数,所以这部分先略过了。

  总结一下:define函数,定义模块;module对象,保存模块信息;require函数,获取外部依赖模块。

  看到这里,估计大家还是一头雾水。没关系,慢慢往下看,下面的例子跑起来的时候,你再回头看就会明白的。

 

模块化改造

  先声明一下,下面的改造过程会参考“5分钟入门”的说明。所以,建议大家先看看。当然,一起看也可以。

  通过看”5分钟入门”的例子可以看出,SeaJS的目录结构还是有点复杂的。所以,最简单的方法就是,把她的例子下载下来,在她的基础之上修改:“5分钟入门”例子下载。

目录结构

  下载完成后,解压到任意目录下。请看一下目录,

  1. hello-seajs/下放我们的html文件;
  2. hello-seajs/assets/sea-modules下存放的是我们需要用到的第三方模块块;
  3. hello-seajs/assets/main,这个目录可以说最重要,是存放我们自己编写的JavaScript和CSS文件的地方。下面还有四个子目录及一个文件:
    1. src存放正常的代码;
    2. test存放测试代码;
    3. docs存放文档;
    4. examples存放示例代码;
    5. package.json是打包的配置文件;
“改造”模块代码

  下面,我们开始改造我们的模块。

  首先,把我GuessNumber.js放到hello-seajs/assets/main/src/下。然后,按照“第1条规范”的要求改 造这个文件中代码。由于整个文件就是GuessNumber对象的定义。同时,这个JavaScript文件又没有引用其他模块。所以,只需要在文件的第 一行增加define,在最后一行增加括号分号就行。具体代码如下:

 

define(function(require, exports, module){
	/**
	* numberScope 需要猜测的数字范围
	*/
	function GuessNumber(numberScope){

        // 为了突出修改的代码,我把一些相同的代码省略了,
        // 完整代码请看:http://www.diguage.com/archives/80.html
	
    }
	
	GuessNumber.prototype = {
    
		constructor: GuessNumber,
	
		// 完整代码请看:http://www.diguage.com/archives/80.html
	}

});

 其次,目前我们已经定义为一个模块。但是外部如何访问这个GuessNumber?所以,我们要向外部提供一个接口,提供方式参考“第2条规范”。具体代码见第18行:

define(function(require, exports, module){
	/**
	* numberScope 需要猜测的数字范围
	*/
	function GuessNumber(numberScope){
    
		// 完整代码请看:http://www.diguage.com/archives/80.html
	
    }
	
	GuessNumber.prototype = {
    
		constructor: GuessNumber,
	
		// 完整代码请看:http://www.diguage.com/archives/80.html
	}

	module.exports = GuessNumber;
    
});

 这时,一个接口已经全部定义完成。下面,我们书写调用这个模块的例子。

  在“规范”的第三条中,我们说明了加载外部依赖模块的方法,我们只需要按说明照做就行。另外,还需要补充一下模块加载时需要注意的地方。具体请看代码注释:

define(function(require) {
	// 这是引入jQuery类库,我们下面说明为什么这样下。
    var $ = require('jquery');
	
	// 引入GuessNumber模块,也就是GuessNumber.js文件。
	// 参数中传递的是GuessNumber.js文件的相对路径。
	// .js的后缀名可以省略,SeaJS在加载的时候会自动加上。
	var GuessNumber = require("./GuessNumber");
    
    // 完整代码请看:http://www.diguage.com/archives/80.html
	
	//格式化显示结果
	function formatResult(num, type) {
		//……
	}
	
	// ……
	
	$("#initButton").click(function(){
		guess.start(scopeArr[type].min, scopeArr[type].max);
		showResult();
	});
});

 从上面的代码中,可以看出,main.js文件的改造,只是把原来的

$(document).ready(function(){

	// 主要的业务代码

});

 改造成了,

define(function(require) {
	// 这是引入jQuery类库,我们下面说明为什么这样下。
    var $ = require('jquery');
	
	// 引入GuessNumber模块,也就是GuessNumber.js文件。
	// 参数中传递的是GuessNumber.js文件的相对路径。
	// .js的后缀名可以省略,SeaJS在加载的时候会自动加上。
	var GuessNumber = require("./GuessNumber");
    
    // 和原文件相同的业务代码

});

 

另外,加了两行倒入必要关联模块的代码。仅此而已。

  main.js与GuessNumber.js不同的还有一点,main.js不需要向外提供访问接口。这点也要注意一下。

  到这里所有的JavaScript都已经修改完毕了。下面,我们修改一下如何在HTML中的引入方式。

 

在页面中加载模块

  原来的写法是,按顺序使用<scrip>标签把jQuery、GuessNumber.js以及main.js文件引入到HTML 页面中即可。如果使用SeaJS,则需要先加载SeaJS的类库,然后使用JavaScript通过SeaJS的接口来加载所需的模块,也就是模块对应的 JavaScript文件。具体代码如下:

<!-- 首先,首先我们需要引入 sea.js -->
<script src="assets/sea-modules/seajs/1.3.1/sea.js"></script>
<script type="text/javascript">
    seajs.config({
        alias: {
            // 指定使用的jQuery版本以及说明jQuery的路径
            // 请注意:这里知名了jQuery的路径,所以,我们
            // 在引入jQuery库时,只需要填写jquery即可。
            'jquery': 'gallery/jquery/1.8.2/jquery' 
        }
    });
   
    // 然后SeaJS通过 use 方法来加载模块,以后打包后也是修改这里
    // 也许你会疑问为什么不加载GuessNumber.js文件,
    // 这个在使用require引入依赖时,SeaJS自动加载需要的外部文件
    // 另外,这里的.js后缀名也可以省略,SeaJS会自动补全。
    seajs.use('./assets/main/src/main');
    
</script>
<!-- 这里只展示了和JavaScript引入相关的代码 -->
<!-- 完整代码请看:http://www.diguage.com/archives/80.html 中的HTML代码 -->

 到此,改造工作就全部完成了。你可以打开一下inde.html文件,看看效果了。

 

打包部署

  根据“高性能网站的十四条黄金法则”中的实践,我们在实际项目上线时,为了提高页面的加载速度,必定要压缩一下JavaScript文件。这些,SeaJS也考虑到了,甚至做得更好:还做了文件合并。

  这里,需要先介绍一下,SPM,一个基于命令行的前端项目管理工具。 SPM 和 SeaJS 关系密切,你甚至可以认为SPM是为SeaJS专门打造的工具。首先,请“安装教程”安装好这个工具。按照过程可能会有一个问题,请参考下面的“出现的问题”。

  使用SPM打包,需要修改一下打包的配置文件。配置文件是:hello-seajs/assets/main/package.json。打开后内容如下:

{
  "name": "main",
  "version": "1.0.0",
  "dependencies": {
    "jquery": "gallery/jquery/1.8.2/jquery"
  },
  "root": "hello-seajs",
  "output": {
    "main.js": ".",
    "main.css": "."
  },
  "spmConfig": {
    "build": {
      "to": "../sea-modules/{{root}}/{{name}}/{{version}}"
    }
  }
}

 不过,这个需要根据我们的实际情况来修改。root属性,由于我们的模块是“猜数”,所以将其修改为GuessNumber;output属性,我们只需 要输出JS,所以删除main.css。另外,需要注意,第十四行,这个是打包后的输出路径。好了,开始打包。打包需要执行如下指令:

$ cd hello-seajs/assets/main
$ spm build 
...
BUILD SUCCESS!
$

 打包结束后,在hello-seajs/assets/中就会发现多了一个GuessNumber文件夹,那个就是打包输出出来。

  这里说明一下:D瓜哥只在Linux下执行了这么命令。不知在Windows是否好使。为了方便大家测试运行,打包结果已提交,下载的代码中包含打包结果。

  观察这个结果,大家会发现只有一个main.js和main-debug.js;顾名思义,main.js是用于生产部署的,经过压缩的文 件;main-debug.js是为测试使用的,只是合并了代码并没有压缩,使用的时候直接引用这个两个文件中的一个就行,直接把seajs.use() 中的路径改一下就OK。GuessNumber.js哪里去了啊?大家可以打开main-debug.js看看(main.js也行,只是压缩过来,可读 性不好),原来,GuessNumber.js已经合并到了main.js中了。SPM把两个文件合并成一个文件了,这样在浏览器访问网页时,就可以减少 一个HTTP请求,提高网页的加载速度。

  另外,大家也可能会注意到在原来main.js中定义的define()函数,在新的main.js有了一些变化,多了两个参数:第一个参数模 块的ID,主要是为了方便区别一个文件中的各个模块;第二个参数是模块依赖的外部模块的路径,因为依赖的模块可能有多个,所以这个参数是一个数组。第三个 参数是原来的function,也就是factory。更详细的解释请看:为什么要用 spm 来压缩 CMD 模块?

  懒人要把懒进行到底!打包后还要修改SeaJS的加载路径,这点其实还可以使用如下代码来避免:

// 这个路径只有在部署到服务器上才行,直接打开文件不好使。
seajs.use(location.host === 'localhost' ? './assets/main/src/main' : 'GuessNumber/main/1.0.0/main');

 如果是非静态页面,也可以使用变量来配置。

 

折腾中出现的问题

  折腾这么个玩意,难免出现一些问题,D瓜哥遇到了三个问题。这些问题主要集中在SPM环境搭建过程中。给大家分享一下。

  第一个问题:按照seajs时,提示info.json不存在的错误。终端显示如下:

d@dPC:~/Dev/hello-seajs/assets$ spm install seajs
Start installing ...
success create global config.json to /home/d/.spm
Downloading: http://modules.spmjs.org/info.json
[ERROR] Caught exception: Error: not found config http://modules.spmjs.org/info.json

 大家可以在浏览器地址中打开http://modules.spmjs.org/info.json,会发现可以打开。这是怎么回事呢?

  我查阅了一下SeaJS论坛,里面有类似的问题。其中的一个回复,我拿过来当作解答吧:这段时间是举国同庆的日子,网络不稳定。至于原因,你懂得。估计等过了这段时间就没事了。所以,既然浏览器可以访问,则内容就可以访问到。遇到这个问题,多试两次就可以了。

  第二个问题:按照jquery库时,提示Error: ALREADY_EXISTS。终端显示如下:

d@dPC:~/Dev/hello-seajs/assets$ spm install gallery.jquery
Start installing ...
Downloading: http://modules.spmjs.org/gallery/info.json
Downloaded: http://modules.spmjs.org/gallery/info.json
Downloading: http://modules.spmjs.org/gallery/jquery/1.8.2/jquery.tgz
Downloaded: http://modules.spmjs.org/gallery/jquery/1.8.2/jquery.tgz
** This module already exists: /home/d/Dev/hello-seajs/assets/sea-modules/gallery/jquery/1.8.2
Turn on --force option if you want to override it.
[ERROR] Caught exception: Error: ALREADY_EXISTS

 其实,问题正如反馈信息所示,jQuery库已经存在,不需要再次下载了。我们在hello-sea这里例子的源代码中构建,这个源代码中已经包含了jQuery了,在这里这步可以忽略。

  第三个问题:修改了package.json后,重新编译报错。终端显示如下:

[WARN] http://modules.spmjs.org/GuessNumber/config.json null

 这个不影响编译,直接忽略就行了。另外说明一下,在第一次打包时,没见这个错误;第二次会出现。

 

代码下载

  为了方便大家下载代码,我把代码托管到了Github上,大家可以去Github上下载、提交您的修改。Github页面:GuessNumber;不想去Github上下载的,也可以直接点击下载:点击下载。

 

深入学习

  上面的例子只是简要把一个例子跑起来了,给大家一个比较形象的认知。但是,这个例子实在是太简单了。我还需补充我们刚才为了易于理解而简化的一些知识。为了更深入的了解SeaJS,请继续阅读“SeaJS 使用文档”。另外,这里有几个需要重点阅读,具体如下:

  1. CMD模块定义规范
  2. require 书写约定
  3. 模块标识
  4. API 快速参考
  5. 模块的加载启动,重点看里面的”最佳实践”
  6. 模块系统

  把这个列表中的东西看完,SeaJS的学习应该就可以出师了。有好的资料请给我推荐,我再补充上来。

遗留问题

  经过上面这些折腾,我们已经成功运行起来一个使用SeaJS进行模块化编程的例子。但是,我们还是有很多的疑问。具体疑问如下:

    1. D瓜哥在main.js中,并没有使用$(document).ready();等DOM加载完再运行,并也没有讲JS放到HTML文件的最后,为啥还能顺序执行呢?莫非SeaJS有什么内部机制,保证在DOM加载完成后再执行我们自己编写的JavaScript代码?
    2. 这里例子很小,并没有很多很多的模块。在模块很多的情况下,如果组织模块?这个还需要写更多的例子,实验一下。
    3. 同样,在很多模块的情况下,难道要建很多目录准备很多的main.js,让众多的HTML分别加载吗?

  刚刚D瓜哥开窍了一下,main.js只是一个例子,可以根据自己的组件名称命名,然后在组件中加载相对应的JavaScript文件即可。另 外,在配置package.json时,突然觉得,在/assets/main/src/下每个目录应该算是一个模块,都有一个打包的配置文件 package.json,用于配置该模块的必要信息。不知这样理解是否正确?这个还有待考证。

 

JavaScript 模块化 了解了一下js模块化,简单记录一下。参考资料: JavaScript 模块化历程 前端模块化模块化发展历程 js一开始并没有模块化的概念,直到ajax被提出,前端能够像后端请求数据,前端逻辑越来越复杂,就出现了许多问题:全局变量,函数名冲突,依赖关系不好处理。 当时使用子执行函数来解决这些问题,比如经典的jquery就使用了匿名自执行函数封装代码,将他们全都挂载到全局变量jquery下 阅读详情

相关推荐

pytorch图像分类篇: 花分类数据集下载和AlexNet网络搭建训练

一、花分类数据集下载 data_setdata_set该文件夹是用来存放训练数据的目录 使用步骤如下: (1)在data_set文件夹下创建新文件夹"flower_data" (2)点击链接下载花分类数据集 (3)解压数据集到flower_data文件夹下 (4)执行"flower_data.py"脚本自动将数据集划分成训练集train和验证集val ├── flower_data ├── flower_photos(解压的数据集文件夹,3670个样本) ...

橙子的博客 8218

模块代码Javascript模块化编程(三):模块化编程实战,试用SeaJS

新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正     看了阮一峰教师的关于JavaScript模块化的文章后,解答了我思考良久的问题,然突有种朗开然豁的感到。后来解了到SeaJS,就想写篇文章,践实一下模块化编程。天今把文章写出来了。发出来,望希对大家有效。      本系列目录      “JavaScript模块化编程(一):模块原型和论理观点详解”

399

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 777

SeaJs:模块化JavaScript的前身

本文将介绍SeaJs的概念、作用及其在现代Web开发中的应用,帮助读者更好地理解SeaJs的重要性,提升前端开发效率。SeaJs是一个早期的模块化JavaScript加载器,它提供了一系列简洁的API,用于简化模块的加载和管理。简洁的语法:SeaJs使用简洁的语法,使得代码更加简洁和易于阅读。强大的功能:SeaJs支持模块的动态加载、依赖管理和缓存等。兼容性:SeaJs支持多种浏览器和Node.js环境。Sea.js具有以下特点:遵循CommonJS。

你若盛开,清风自来 1623

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1770

保姆级教程:用C++逆向解析通达信shm.tnf文件(附完整代码与偏移量详解)

本文提供了一份详细的C++逆向工程教程,指导开发者如何解析通达信的shm.tnf文件。通过分析文件结构、定位关键字段并实现完整解析流程,帮助量化交易开发者高效获取沪市股票数据。教程包含完整代码示例和偏移量详解,适合金融数据本地化处理需求。

weixin_27945229的博客 524

【Javascript】【模块化】通过seaJs实现模块化

seaJs是CMD前端模块化规范的实现,seaJs使用define和use关键字实现模块化,用法如下 main.html <html> <head> <meta charset="UTF-8"/> <title>Webstorm</title> </head> &lt...

天天向上 Up Up Up (*^▽^*) 535

Flink CDC 实战:5分钟搞定PostgreSQL数据实时同步(附避坑指南)

本文详细介绍了如何使用Flink CDC实现PostgreSQL数据的实时同步,包括环境配置、逻辑复制槽创建、Flink环境搭建及实战验证。通过5分钟快速指南,帮助开发者高效搭建实时数据管道,并提供了常见问题排查和生产环境优化建议。

red88的博客 820

JavaScript模块化编程

最近项目上在做前端开发,用到的插件使用了RequireJS进行模块化,第一次接触,感觉挺实用的,大致研究了下,主要解决了目前JavaScript存在的两个问题:1.全局变量的命名冲突。2.JS文件依赖关系混乱。由于目前并没有官方认证的前端模块化标准,所以目前主流的就有AMD和CMD两种。

基因记忆 795

佳能C3025打印机扫描方法

佳能C3025彩色打印机扫描方法 步骤一、如果打印机处于休眠状态,可按图中标记的按钮唤醒打印机; 然后点击屏幕上的【扫描】 步骤二、扫描类型选择【文件】 步骤三、点击屏幕上的【地址簿】 步骤四、此时屏幕胡看到名字,如果看不到自己的名字,可往下滑动直到看到自己的名字,然后点击自己的名字,再点击右下角的【应用】 步骤五、点击【发送设置】,可看到文件格式为PDF,点击可以选择JPEG的图片格式。...

weixin_46019317的博客 2万+

Element Server Suite社区版Helm部署:私有Matrix聊天服务器快速搭建指南

在云原生和微服务架构日益普及的今天,容器化部署已成为现代应用交付的标准范式。Kubernetes作为容器编排的事实标准,通过声明式配置和自动化管理,极大地简化了复杂分布式系统的部署与运维。Helm作为Kubernetes的包管理器,通过预定义的Chart模板,将应用及其依赖打包,实现了真正的“一键部署”,显著提升了部署效率和可重复性。这种技术组合的价值在于,它让开发者能够专注于业务逻辑,而非底层基础设施的复杂性,尤其适用于需要快速搭建、易于维护的服务场景。Element Server Suite Commu

weixin_42610010的博客 300

JS模块化编程——seajs

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

S1mp1e的专栏 675

23、工业物流中的多智能体路径规划与碰撞处理策略

本文探讨了工业4.0背景下工业物流中的多智能体路径规划(MAPF)与碰撞处理策略。分析了自动导引车(AGV)等移动资源的应用现状,综述了主流路径规划算法如A*、D*Lite、M*等,以及集中式与分布式碰撞检测方法。重点比较了五种碰撞避免策略:路径交叉、优先级、起始时间调整、无交叉路径和速度调整,提出了基于环境条件的策略选择流程,并通过流程图展示了评估、组合、测试与优化的全过程。文章强调应根据订单不确定性、时间约束、优先级和生产组织等因素综合选择或组合策略,以提升物流效率与系统可靠性。

mac99的博客 125

JS模块化编程

1. 背景   JS的强大已经不用解释了,从Web RIA到Node服务器,到处都是JS的身影。然而由于出身的缘故,JS本身在大规模应用上存在着很多问题,比如模块化编程。本文以浏览器端模块化编程为内容,重点介绍AMD规范和CMD规范。在服务器端,NodeJS遵守的Common规范我们这里暂不讨论。   对于计算机语言,模块化编程是必不可少的,对架构设计、代码复用起到至关重要的作用,工程中引入别

前端小白 4580

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用SeaJS实现模块化JavaScript开发

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34367257的博客 193

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

模块化JS(RequireJS SeaJS)

模块加载器的由来 1. 由于JS在加载的时候,会阻碍整个页面的加载,导致页面的空白期,这对于网站来说是致命的; 2. JS没有模块概念,导致很难管理模块间关系; 由于如上原因,模块化框架应运而生。 RequireJS & SeaJS是现在主流的模块化框架,今天我们就来比较一下这两个框架,我在项目中都真实的使用过,希望给选择的人一些参考。 RequireJS

Aric_Chen的专栏 2629

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JS模块化规范CMD之SeaJS

1. 在接触规范之前,我们用模块化来封装代码大多为如下: ;(function (形参模块名, 依赖项, 依赖项) { // 通过 形参模块名 修改模块 window.模块名 = 形参模块名 })(window.模块名 || {}, 依赖项, 依赖项) 分号是什么作用? 答:为了防止前面的代码没有添加分号造成语法解析错误,也可能会是 "!",...

187

SeaJS简介三:模块载入和引用

之前对模块有过介绍,一个模块对应一个js文件,而载入模块时一般都是提供一个字符串参数告诉载入函数需要的模块,所以就需要有一套从字符串标识到实际模块所在文件路径的解析算法。 SeaJS支持如下几种方式: 第一种:绝对路径--给出js文件的绝对路径 require("http://example/js/a"); 第二种:相对路径--用相对调用载入函数所在js文件的相对地址寻找模块 require(".

Q 2万+

JavaScript模块化开发库之SeaJS

转自:http://www.2cto.com/kf/201203/125450.html JavaScript模块化开发库之SeaJS SeaJS由国内的牛人lifesinger开发。目前版本是1.1.1,源码不到1500行,压缩后才4k,质量极高。 这篇会讲述SeaJS的一些基本用法,不会面面俱到,但会就个人的理解讲述官方文档没有提到的一些细节。   一、SeaJS的全

清风的专栏 950

SeaJS简介一:由来,特点以及优势

由来: 在软件开发过程中,模块化编程思想已经习以为常了,模块化编程不仅仅给开发团队带来效率方面上的好处,还能够让开发的项目或者产品维护成本大大降低。 那么,在WEB开发过程中JS脚本语言已经不可或缺了,通过JS脚本语言能够带来更加舒适的人机交互和用户体验。但是,JS脚本的使用过程中也会有出现引用依赖的混乱,那么JS脚本语言的模块化思想势必会得到大家广泛的认可,在这样的一个背景下,淘宝前端工程师玉伯

Q 5271

使用SeaJS实现模块化JavaScript开发(新)

本文转自张洋,因为SeaJS更新版本很快,所以原文中很多地方不太适用,在这里发布一个更新版。 前言   SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。使用SeaJS可以提高JavaScript代码的可读性和清晰度,解决目前JavaScript编程中普遍存在的依赖关系混乱和代码纠缠等问题,方便代码的编写和...

220

SeaJS前端模块化开发:从入门到精通的完整指南

在当今复杂的前端开发环境中,模块化已经成为提升代码质量和维护性的关键手段。SeaJS作为一款专为Web设计的JavaScript模块加载器,通过简洁的CMD规范为开发者提供了优雅的模块化解决方案。本文将带你全面了解SeaJS的核心概念、使用方法和最佳实践,助你掌握前端模块化开发的精髓。 ## 🚀 快速入门:环境搭建与基础配置 要开始使用SeaJS,首先需要获取项目代码。可以通过以下命令克隆仓

gitblog_00974的博客 894
上一篇: Javascript模块化编程(二):模块化编程实战
下一篇: Python中*args 和**kwargs的用法
weistar103
博客等级 码龄18年 12粉丝 281原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值