9

requirejs学习笔记及requirejs在Open edX中的使用

 2 years ago
source link: http://wwj718.github.io/post/%E5%B7%A5%E5%85%B7/requirejs-note/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

requirejs学习笔记及requirejs在Open edX中的使用

2016-05-05

解决的问题

  • 实现js文件的异步加载,避免网页失去响应;
  • 管理模块之间的依赖性,便于代码的编写和维护。
  • Require.JS 是一个基于 AMD 规范的 JavaScript 模块加载框架
  • 实现 JavaScript 文件的异步加载,管理模块之间的依赖性,提升网页的加载速度。
  • AMD 是 Asynchronous Module Definition 的缩写,意思就是 异步模块定义。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

参考javascript模块化编程(三):require.js的用法

模块的加载

  • 使用require.config()方法,我们可以对模块的加载行为进行自定义
    • require.config()就写在主模块(main.js)的头部
  • require.js提供了一个优化工具,当模块部署完毕以后,可以用这个工具将多个模块合并在一个文件中,减少HTTP请求数。
  • 如果某个模块在另一台主机上,也可以直接指定它的网址
:::text
 require.config({
    paths: {
      "jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
    }
  });

加载非规范的模块

require.config()接受一个配置对象,这个对象有一个shim属性,专门用来配置不兼容的模块。

require.js插件

  • domready插件,可以让回调函数在页面DOM结构加载完成后再运行。
  • text和image插件,允许require.js加载文本和图片文件
  • json和mdown,用于加载json文件和markdown文件

requirejs官方入门文档


Open edX与requirejs

Open edX前端采用了requirejs来管理模块依赖,这方面的相关文档可参考:<openedx.atlassian.net/wiki>

  • /edx/app/edxapp/edx-platform/cms/static/js/base.js
  • require-config.js (ack-grep -g “require-config.js”)
    • /edx/app/edxapp/edx-platform/lms/static/lms/js/require-config.js
    • /edx/app/edxapp/edx-platform/cms/static/cms/js/require-config.js
      • 在此可以写给mathjax cdn路径,mathjax
  • 来看一下引用了require-config.js的地方(ack-grep require-config.js)
    • lms/templates/main.html
      • 页面开始的static_content.html来自common/djangoapps/pipeline_mako/templates/static_content.html
    • lms/static/lms/js/build.js
    • cms/templates/base.html
    • cms/static/cms/js/build.js
  • 引用require.js的地方 (ack-grep require.js)
    • cms/templates/base.html
    • cms/envs/common.py
    • lms/envs/common.py ,require.js被放在base_vendor_js里
base_vendor_js = [
    'js/vendor/jquery.min.js',
    'js/vendor/jquery.cookie.js',
    'js/vendor/url.min.js',
    'js/vendor/underscore-min.js',
    'js/vendor/require.js',
    'js/RequireJS-namespace-undefine.js',
    'js/vendor/URI.min.js',
    'js/vendor/backbone-min.js'
]
  • main_vendor_js由包括了base_vendor_js,之后lms/templates/main_django.html中有:
:::text
  {% block main_vendor_js %}
  {% javascript 'main_vendor' %}
  {% endblock %}

案例cms login

我们以cms的login.html为例(/edx/app/edxapp/edx-platform/cms/templates/login.html)

:::text
<%block name="requirejs">
  require(["js/factories/login"], function(LoginFactory) {
      LoginFactory("${reverse('homepage')}");
  });
</%block>

这部分就是添加自己逻辑的地方: /edx/app/edxapp/edx-platform/cms/static/js/factories/login.js

可以看到这是按照AMD规范写的模块

从这里我们也可以看到mako如何把参数传到js里

案例 search_results_view

其他案例包括How to add a new page to LMS or Studio推荐的例子:

关于ui方便,官方推荐使用backbone.js来写

案例asset(观察backbone的使用)

  • ack-grep backbone ,跟踪asset.js
    • /edx/app/edxapp/edx-platform/cms/static/js/collections/asset.js
  • ack-grep js/collections/asset
    • static/js/factories/asset_index.js
  • ack-grep “js/factories/asset_index”
    • /edx/app/edxapp/edx-platform/cms/templates/asset_index.html
:::text
<%block name="requirejs">
    require(["js/factories/asset_index"], function (AssetIndexFactory) {
        AssetIndexFactory({
          assetCallbackUrl: "${asset_callback_url}",
          uploadChunkSizeInMBs: ${chunk_size_in_mbs},
          maxFileSizeInMBs: ${max_file_size_in_mbs},
          maxFileSizeRedirectUrl: "${max_file_size_redirect_url}"
        });
    });
</%block>
  • ack-grep asset_index.html
    • djangoapps/contentstore/views/assets.py
  • -> def assets_handler
  • -> url(r’^assets/{}/{}?$’.format(settings.COURSE_KEY_PATTERN, settings.ASSET_KEY_PATTERN), ‘assets_handler’)
    • 对于studio课程里的文件&上传

文章作者 种瓜

上次更新 2016-05-05

Open edX分布式部署建议 nginx使用笔记


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK