requirejs源码分析: requirejs 方法–1. 主入口

时间:2022-02-03 21:27:03

该方法是 主要的入口点 也是最常用的方法。

req = requirejs = function (deps, callback, errback, optional) {

//Find the right context, use default
       var context, config,
           contextName = defContextName;

//这里判断当前的require是否为config请求
       //deps不是数组   和    字符串时。
       //将第一个参数设置为config
       // Determine if have config object in the call.
       if (!isArray(deps) && typeof deps !== 'string') {
           // deps is a config object
           config = deps;
           if (isArray(callback)) {
               // Adjust args if there are dependencies
               deps = callback;
               callback = errback;
               errback = optional;
           } else {
               deps = [];
           }
       }

//自定义配置文件的语法上下文 名称
       if (config && config.context) {
           contextName = config.context;
       }

//不存在  上下文时,生成一个上下文实例
       context = getOwn(contexts, contextName);
       if (!context) {
           context = contexts[contextName] = req.s.newContext(contextName);
       }

//当前为配置信息请求时,
       //对信息的初始化
       if (config) {
           context.configure(config);
       }

return context.require(deps, callback, errback);
   };

该方法代码比较短。 但 内容里的 调用的方法 是比较复杂的。

主要流程:

1.  创建 上下文 实例。

context = contexts[contextName] = req.s.newContext(contextName);

每一个请求都会有一个 上下文  实例,可以理解为封装到一个对象里,进行统一管理。

2.  利用 上一步 生成的 上下文 实例, 加载模块。

return context.require(deps, callback, errback);

部分源码分析:

1.

if (config) {
           context.configure(config);
       }

这里主要是配置信息进行初始化处理。baseUrl,shim 加工补充等。

其他:

1. 第一个参数如果 非数组或字符串, 将判断当前的 请求 是 配置文件请求。