Example #1
0
    function resolve(id) {
        // 尝试以package处理
        var packages = moduleConfig.packages || [];
        var realPath;
        var i;
        for (i = 0; i < packages.length; i++) {
            var pkg = packages[i];
            var pkgName = pkg.name;
            var pkgLoc = pkg.location;
            var absPkgLoc = path.resolve(baseUrl, pkgLoc);
            // 是以package开头的
            if ((new RegExp('^' + pkgName + '(/|$)')).test(id)) {
                if (!edp.path.isRelativePath(pkgLoc)) {
                    return id;
                }
                // 如果不需要对 module.conf 里配置的 package 和 paths 转换为相对路径,那么直接返回
                if (!resolveAll) {
                    return id;
                }
                var pkgMain = pkg.main || 'main';
                if (id === pkgName) {
                    realPath = absPkgLoc + '/' + pkgMain;
                    return path.relative(absFileDir, realPath);
                }
                realPath = absPkgLoc + id.replace(pkgName, '');
                return path.relative(absFileDir, realPath);
            }
        }

        // 尝试以paths配置处理
        var paths = moduleConfig.paths || {};
        var pathKeys = Object.keys(paths).slice(0);
        pathKeys.sort(function (a, b) {
            return paths[b].length - paths[a].length;
        });
        for (i = 0; i < pathKeys.length; i++) {
            var key = pathKeys[i];
            var modulePath = paths[key];
            var absModulePath = path.resolve(baseUrl, modulePath);
            // 是以paths里某项开头的模块
            if ((new RegExp('^' + key + '(/|$)')).test(id)) {
                if (!edp.path.isRelativePath(modulePath)) {
                    return id;
                }
                // 如果不需要对 module.conf 里配置的 package 和 paths 转换为相对路径,那么直接返回
                if (!resolveAll) {
                    return id;
                }
                realPath = id.replace(key, absModulePath);
                return path.relative(absFileDir, realPath);
            }
        }

        // 剩下的要么以baseUrl作为顶层目录的,要么本身就是相对路径
        // 本身是相对路径的case,例如: '../modA', './modB'
        if (/^\./.test(id)) {
            return id;
        }

        // 以baseUrl作为根目录的case,例如: 'dirA/modA'
        // 先以baseUrl计算得到模块的绝对路径,然后再相对当前文件计算相对路径
        var relativeId = path.relative(absFileDir, path.resolve(baseUrl, id));
        return /^\./.test(relativeId) ? relativeId : './' + relativeId;
    }