• JS模块化编程(四)--require应用


    • 获取&使用require.js

    下载最新版的Require.JS。
    下载之后,把它放在项目的脚本文件夹下,比如 js 文件夹下,项目结构看上去应该是:

    要充分使用Require.JS,将html 文件中所有的内联脚本都移除,只留下一
    句话:

    <!DOCTYPE html>

    <html>
    <head>
    <title>My Sample Project</title>
    <!-- data-main 属性告诉 require.js 在 require.js 加载之后加载 js/main.js -->
    <script data-main="js/main" src="js/require.js"></script>
    </head>
    <body>
    <h1>My Sample Project</h1>
    </body>
    </html>

    在 main.js 中,可以通过 require() 加载依赖的脚本,这样不用在 html 中显示声明。
    main.js 相当于是一个入口点:

    require(["helper/util"], function (util) {
    // 当 scripts/helper/util.js 加载完毕,会执行这个回调函数
    // 如果 util.js 也声明了依赖的文件(模块),那么这个函数会等到那些依赖的文件(模块)
    加载完毕后才调用
    //TODO
    });

    • 加载js 文件

    通过刚才的介绍,可以看出来 RequireJS 采用了不同于传统 <script> 标签的加载方式,
    传统的 <script> 标签方式一般都会有下面的代码:

    <body>
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.plugin.xx.js"></script>
    <script type="text/javascript" src="js/a1.js"></script>
    <script type="text/javascript" src="js/a2.js"></script>
    <script type="text/javascript" src="js/a3.js"></script>
    ……
    </body>

    而require.js采用了模块ID 加载方式

    <script data-main="js/main" src="js/require.js"></script>

    RequireJS 查找脚本的路径,主要是通过 baseUrl,在 data-main 中,声明了 baseUrl
    的路径,在这句代码里也就是 js 文件夹;如果不声明 data-main,则 baseUrl 默认指向
    这个 html 页面所在的文件夹。当然,也可以通过配置来声明 baseUrl,下文会详述。
    注意,data-main 中声明的模块会被异步加载,也就意味着如果页面后面通过 <script>
    加载多个脚本,这些脚本不一定在 data-main 中声明的模块加载之后才加载;或者后面
    的js 代码如果有对 data-main 中声明的模块的依赖,则有可能会出现错误。
    RequireJS 会假定所有依赖项默认都是脚本,所以书写依赖时可以省略 “.js” 后缀,
    RequireJS 会自动加上这个后缀。RequireJS 会自动把模块ID 翻译成一个路径
    (path),我们也可以在配置中声明多个路径(paths),通过 baseUrl + paths,可以用
    很少的代码找到相应的 js 文件,比起 <script> 标签要优雅简洁很多。
    一般来说,通过 baseUrl + paths 就可以找到js 文件,不过有时候,可能会有例外,一旦
    RequireJS 发现模块 ID 中包含如下的字符,那么它就不按照 baseUrl + paths 的方式来
    寻找这个模块的js 文件了,而是采用 URL 的方式:
    o 如果 ID 以 “.js” 结尾
    o 如果 ID 以 “/” 开头
    o 如果 ID 以 “http:” 或者 “https:” 开头
    一般来说,最好使用 baseUrl + paths 的方式来声明模块ID,这样做会有更多的灵活性。
    同样的,我们在组织js 代码文件的时候,尽量避免使用很深的路径,而最好把js 文件都放
    置在 baseUrl 下面,最好不要超过两层的深度,下面就是一个很好的例子:
     www/
     index.html
     js/
     app/
     sub.js
     lib/
     jquery.js
     canvas.js
     app.js
    在 index.html 中:

    <script data-main="js/app.js" src="js/require.js"></script>

    在 app.js 中:

    requirejs.config({
    //默认从 js/lib 中加载模块
    baseUrl : 'js/lib',
    //如果模块ID 以app 开头,则会在 js/app 目录下寻找
    //不过要注意千万不要加上 ".js",否则paths 的规则就会失效
    paths : {
    app : '../app'
    }
    });
    requirejs(['jquery', 'canvas', 'app/sub'],
    function ($, canvas, sub) {
    //jQuery, canvas 和 app/sub 模块都加载完毕后,会执行这个函数
    //TODO

    });

    使用RequireJS 时,建议像 jQuery 这样带有版本号的库,用单独的文件来标识版本号,
    在文件命名中把版本号去掉。

    • 定义模块

    RequireJS 要求一个js 文件只定义一个模块。不过这样的话,每加载一个模块,就会产生
    一个HTTP 请求,RequireJS 提供了一个优化工具,在最后生产环境中,可以打包所有模
    块到一个文件中。
    定义模块可以使用 define() 方法,define() 有三个参数,可以参考前文中的介绍。
    定义一个只有键值对,没有任何依赖的模块:

  • 相关阅读:
    2017/09/02笔记:ps
    207/08/3学习笔记:pc端网站如何实现移动端适配知识点
    2017/0828xueix笔记:图像替代文本&css绘制的图形
    20170824:面试题笔记
    目前比较全的CSS重设(reset)方法总结
    学习笔记:css3实现多行文字溢出显示省略号&display:box;
    SVG圆形<circle> 标签
    k8s节点分配nodeSelector, Affinity和Anti-Affinity 亲和性和反亲和性
    kubernetes网络介绍
    centos6.7 安装docker
  • 原文地址:https://www.cnblogs.com/jeffry/p/5339550.html
Copyright © 2020-2023  润新知