设计联盟

Sea.js的运行原理及入门讲解

发布日期:2016-01-13 09:32:24   浏览量:

4.资源定位

资源定位与模块标识相关,而在Sea.js中有三种模块标识:

普通路径:普通路径与网页中超链接一样,相对于当前页面解析。

相对标识:在define的factory中的相对路径(.. .)是相对标识,相对标识相对当前的URI来解析

顶级标识:不以.或者‘/‘开头的模块标识是顶级标识。

获取真实路径:在Sea.js中,使用data.cwd来代表当前页面的目录;使用data.base来代表sea.js的加载地址。

5.factory依赖分析

在Sea.js的API中,define(factory),并没有指明模块的依赖项,那Sea.js是如何获得的呢。

/**
 * util-deps.js - The parser for dependencies
 * ref: tests/research/parse-dependencies/test.html
 */

var REQUIRE_RE = /"(?:\\"|[^"])*"|‘(?:\\‘|[^‘])*‘|\/\*[\S\s]*?\*\/|\/(?:\\\/|[^\/\r\n])+\/(?=[^\/])|\/\/.*|\.\s*require|(?:^|[^$])\brequire\s*\(\s*(["‘])(.+?)\1\s*\)/g
var SLASH_RE = /\\\\/g

function parseDependencies(code) {
  var ret = []

  code.replace(SLASH_RE, "")
      .replace(REQUIRE_RE, function(m, m1, m2) {
        if (m2) {
          ret.push(m2)
        }
      })

  return ret
}

Sea.js就是使用REQUIRE_RE在factory的源码中匹配出该模块的依赖项。从REQUIRE_RE这么长的正则来看,这里坑很多;在CommonJS的wrapper方案中可以使用JS语法分析器来获取依赖会更准确。

继续阅读