我的模块加载系统 v17的入门教程2

本文探讨了AMD模块化机制及其与jQuery的整合方法,包括模块引用、别名机制和与mass.js的协同工作。重点介绍了如何通过配置实现模块路径的灵活管理,并通过实例展示了如何简化模块引入过程,以及如何利用别名机制方便地引用多个JS文件。同时,通过整合jQuery源码,演示了如何在外层包裹实现多库共存,确保不同库之间的互不影响。

第一节,我们聊到相对于当前目录用“./”,相对于父目录用“../”,相对于父父目录用“http://www.cnblogs.com/”,如果是远程文件直接用URL。其实模块标识还有一种是相对于根目录,这特指是mass.js所在的目录。当然你可以通过配置手段修改根目录,但不建议这样干。比如aaa.js与mass.js是会于同一目录,用么沿着第一节的例子:

<!DOCTYPE HTML>
<html>
    <head>
        <title>AMD</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="mass.js">

        </script>
        <script>
       //相当于$.require("./aaa", fn),只有模块与mass.js是位于同一模块才能这样干
           $.require("aaa", function(a,b){
		      alert(a+b)
		   })
        </script>
    </head>
    <body>
        <h2>欢迎加入mass Framework团队!</h2> 
    </body>
</html>

o_amd_root.jpg

别名机制

比如一个项目,a页面引用N个JS文件,b页面要引用N个js文件,那么当我们用$.require调用它们可能很麻烦,不断地通过"./","../"来定位到目标JS文件中。这时我们可能用一个专门的JS文件对这些模块进行别名,方便引用。

比如我们在第一节提到aaa.js, bbb.js, ccc.js, ddd.js,我们用一个modules保存它们的别名.

//$.core.base 为mass.js的目录
$.config({
  alias:{
     $aaa: $.core.base + "aaa.js",
     $bbb: $.core.base + "bbb.js",
     $ccc: $.core.base + "ccc.js",
     $ddd: $.core.base + "ddd/ddd.js"
   }
})

然后在页面上这样引用ddd.js模块

<!DOCTYPE HTML>
<html>
    <head>
        <title>AMD</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="mass.js">
 
        </script>
		<script src="modules.js">
 
        </script>
        <script>
       //相当于$.require("./aaa", fn),只有模块与mass.js是位于同一模块才能这样干
           $.require("$ddd", function(d){
              alert(d)
           })
        </script>
    </head>
    <body>
        <h2>欢迎加入mass Framework团队!</h2> 
    </body>
</html>

相对应的,这些JS模块也可以改为

//aaa.js 没有依赖不用改
define("aaa",function(){
    return 1
})

//bbb.js  没有依赖不用改
define("bbb",function(){
    return 2
});
//ccc.js
define("ccc",["$aaa"],function(a){
    return 10+a
})

//ddd/ddd.js
define("ddd",["$ddd"], function(c){
   return c+100
});

那么它就会正确弹出111!

o_amd_ddd.jpg

万一有一天,我们把ddd.js移到其他目录,如变成http://xdsfsd/sadfs/ddd.js,那么我们只需要改modules目录就行了!不用改$.require,也不用改ddd的依赖列表!

//$.core.base 为mass.js的目录
$.config({
  alias:{
     $aaa: $.core.base + "aaa.js",
     $bbb: $.core.base + "bbb.js",
     $ccc: $.core.base + "ccc.js",
     $ddd: "http://xdsfsd/sadfs/ddd.js"
   }
})

好了,我们再来看看jQuery与mass.js的使用。jQuery虽说是加了几行支持AMD,其实非常鸡肋!不过jQuery的多库共存做得很不错!我们只需要在外面包一层就能用了。到jQuery官网下载jQuery源码,无论是压缩版还是注释版。新建一个jquery.js文件,与mass.js同一目录,内容如下:

define("jquery", function(){
    //*********jquery源码*********
      return jQuery.noConflict(true);
})

<!DOCTYPE HTML>
<html>
    <head>
        <title>AMD</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="mass.js" >

        </script>
        <script>
            $.require("jquery", function(jQuery){
                $.log(jQuery.fn.jquery);//这是jquery
                $.log($.mass); //这是mass.js
            })
            setTimeout(function(){
                $.log($)//这也是mass.js,jquery没有污染都外边的
            },1000)
        </script>
    </head>
    <body>
    </body>
</html>

我们打开firebug可以看到以下日志:

o_amd_log.jpg

jquery插件的使用,也是外包一层

(function($)
 $.fn.overlabel = function() {
    this.each(function(index) {
        var label = $(this); var field;
        var id = this.htmlFor || label.attr('for');
        if (id && (field = document.getElementById(id))) {
            var control = $(field);
            label.addClass("overlabel-apply");
            if (field.value !== '') {
                label.css("text-indent", "-1000px");
            }
            control.focus(function () {label.css("text-indent", "-1000px");}).blur(function () {
                if (this.value === '') {
                    label.css("text-indent", "0px");
                }
            });
            label.click(function() {
                var label = $(this); var field;
                var id = this.htmlFor || label.attr('for');
                if (id && (field = document.getElementById(id))) {
                    field.focus();
                }
            });
        }
    });
};
})(jQuery)

改造为

define("jquery_overlabel",["./jquery"], function(jQuery){
  (function($){
      //************
  })(jQuery);
})

本节完!

### 关于 IC_S7-PLCSIM_V17 的下载与使用说明 #### 下载途径 IC_S7-PLCSIM_V17 是西门子官方提供的一款用于 PLC 编程和调试的仿真工具,通常作为 TIA Portal 软件的一部分随附安装。如果需要单独获取该版本,可以通过访问西门子官方网站的服务页面或者授权经销商渠道进行下载[^1]。 #### 使用前提条件 在正式使用 S7-PLCSIM V17 前,建议遵循以下准备事项: - **硬件兼容性**:确认计算机满足最低运行需求,包括操作系统支持 Windows 10 或更高版本以及足够的内存空间。 - **软件依赖项**:需先完成 TIA Portal V17 的基础安装过程;随后通过附加组件选项启用 PLCSIM 功能模块[^3]。 #### 配置与启动流程 以下是针对 S7-PLCSIM V17 的典型设置指南: 1. 打开 TIA Portal 并加载目标项目工程文件。 2. 在设备视图中右键单击 CPU 设备节点并选择“在线/诊断 -> 启动 PLCSIM”命令以激活模拟器实例。 3. 如果涉及网络通信场景(如 Modbus TCP),则应进入 SIMATIC_PLCSIM_Advanced 工具界面调整 IP 地址参数,并验证端口连通状态[^4]。 对于某些高级功能测试失败的情况,可能源于未正确匹配固件级别或是驱动程序冲突等问题[^2]。此时可以尝试更新至最新服务包补丁或切换到更适配的目标平台重新构建实验环境。 ```python # 示例 Python 脚本片段展示如何利用 UA Expert 测试 OPC-UA 数据源连接情况 from opcua import Client def test_opc_connection(server_url="opc.tcp://localhost:4840"): client = Client(server_url) try: client.connect() print("Connection successful!") except Exception as e: print(f"Failed to connect due to {e}") finally: client.disconnect() test_opc_connection() ``` 上述脚本可用于辅助检验由 S7-PLCSIM 提供虚拟化后的工业自动化控制系统是否能够正常对外暴露接口资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值