vue.js 0.1.0源码学习(二)—— 从require('vue')说起

require('vue') 将路径变为了 "vue/src/main.js"处理

Paste_Image.png
  • require.resolve处理路径的过程就是根据扩展名循环的去查找是否有已注册的,也就是在require.modules中获取,或者是在require.aliases中, 最终在require.aliases的vue/index.js模块中找到


    vue.js 0.1.0源码学习(二)—— 从require('vue')说起_第1张图片
    Paste_Image.png
require.exts = [
    '',
    '.js',
    '.json',
    '/index.js',
    '/index.json'
 ];
  • vue/index.js模块是怎么注册的呢?

  • 在4765这一行 require.alias("vue/src/main.js", "vue/index.js");

require.alias = function (from, to) {
        if (!require.modules.hasOwnProperty(from)) {
            throwError()
            return
        }
        require.aliases[to] = from;  // require.aliases["vue/index.js"] = "vue/src/main.js";

        function throwError() {
            throw new Error('Failed to alias "' + from + '", it does not exist');
        }
    };

vue/src/main.js注册模块

Paste_Image.png
  • 通过module.call调用模块


    Paste_Image.png
  • 其中require.relative方法是获取相关依赖模块名称

vue.js 0.1.0源码学习(二)—— 从require('vue')说起_第2张图片
require.relative
  • 所以模块调用就是module.call(this, {}, localRequire, {exports:{}, component: true, client: true})
  • 调用vue/src/main.js模块后由下图可以看到mod的变化,原本mod只是一个空对象


    vue.js 0.1.0源码学习(二)—— 从require('vue')说起_第3张图片
    mod的变化
  • 将mod.exports交回到module上,并返回module.exports
  •   module.call(this, mod.exports, require.relative(resolved), mod);
      delete module._resolving;
      module.exports = mod.exports;
      …………
     return module.exports;
    

你可能感兴趣的:(vue.js 0.1.0源码学习(二)—— 从require('vue')说起)