是否可以在SystemJS配置中覆盖地图别名?

时间:2016-04-20 09:48:42

标签: javascript systemjs

方案

我正在使用具有特定命名空间的代码库。但部分代码库是本地的,其他几个部分是npm模块,它们都属于同一个命名空间。

问题

如果可以“覆盖”SystemJS配置中的地图别名,我正在努力解决这个问题?我遇到的问题是,我想为本地版本的库声明一个基本别名,然后为npm模块声明更具体的地图别名。

尝试1

最初我认为有可能这样做:

{
    bundles: {
        'bx/google/drive': ['bx/google/drive/files', 'bx/google/drive/permissions', 'bx/google/drive/query']
    },
    map: {
        'bx/': '/src/bx',
        'bx/google/core': 'node_modules/bx.google.core/bundles/bx.google.core.js',
        'bx/google/drive': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
        'bx/google/analytics': 'node_modules/bx.google.analytics/bundles/bx.google.analytics.js',
        'typescript': 'node_modules/typescript/lib/typescript.js',
        'systemjs': 'node_modules/systemjs/dist/system.src.js'
    },
    packages: {
        bx: {
            defaultExtension: 'js'
        }
    }
}

但是这只使用初始bx/别名来解析从该路径开始找到的任何导入,因此无法加载任何bx npm模块代码。

尝试2

我想我可以使用包地图定义所有bx'sub'模块:

System.config({
    bundles: {
        'bx/google/drive': ['bx/google/drive/files', 'bx/google/drive/permissions', 'bx/google/drive/query']
    },
    map: {
        'bx': '/src/bx',
        'typescript': 'node_modules/typescript/lib/typescript.js',
        'systemjs': 'node_modules/systemjs/dist/system.src.js'
    },
    packages: {
        bx: {
            defaultExtension: 'js',
            map: {
                './google/core': 'node_modules/bx.google.core/bundles/bx.google.core.js',
                './google/drive': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
                './google/drive/files': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
                './google/drive/permissions': 'node_modules/cx.google.drive/bundles/bx.google.drive.js',
                './google/drive/query': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
                './google/analytics': 'node_modules/bx.google.analytics/bundles/bx.google.analytics.js'
            }
        }
    }
});

这会失败,但不会以同样的方式,因为在使用导入的类之前不会抛出任何错误,因为从npm模块导入的任何bx类都是undefined。 (我还必须明确定义所有捆绑导入路径)。

到目前为止

解决方案

我到目前为止找到的唯一方法是从地图中删除bx/定义,并明确列出/src/bx/内代码的每个地图别名和包。即

{
    bundles: {
        'bx/google/drive': ['bx/google/drive/files', 'bx/google/drive/permissions', 'bx/google/drive/query']
    },
    map: {
        'bx/forms': '/src/bx/forms',
        'bx/preload': '/src/bx/preload',
        'bx/cache': '/src/bx/cache',
        /* etc */
        'bx/google/core': 'node_modules/bx.google.core/bundles/bx.google.core.js',
        'bx/google/drive': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
        'bx/google/analytics': 'node_modules/bx.google.analytics/bundles/bx.google.analytics.js',
        'typescript': 'node_modules/typescript/lib/typescript.js',
        'systemjs': 'node_modules/systemjs/dist/system.src.js'
    },
    packages: {
        'bx/forms': {
            defaultExtension: 'js'
        },
        'bx/preload': {
            defaultExtension: 'js'
        },
        'bx/cache': {
            defaultExtension: 'js'
        }
    }
}

哪个不太理想。

问题

所以我想知道的是,是否可以为本地bx/代码(bx: 'src/bx')定义“基本”地图别名,然后使用更具体的地图别名覆盖该别名bx npm模块?

**更新**

将基础bx/添加到paths,无需将所有bx路径单独列为maps中的唯一值,但仍需要在packages中单独列出{1}}。

{
    bundles: {
        'bx/google/drive': ['bx/google/drive/files', 'bx/google/drive/permissions', 'bx/google/drive/query']
    },
    paths: {
        'bx/': '/src/bx'
    },
    map: {
        'bx/google/core': 'node_modules/bx.google.core/bundles/bx.google.core.js',
        'bx/google/drive': 'node_modules/bx.google.drive/bundles/bx.google.drive.js',
        'bx/google/analytics': 'node_modules/bx.google.analytics/bundles/bx.google.analytics.js',
        'typescript': 'node_modules/typescript/lib/typescript.js',
        'systemjs': 'node_modules/systemjs/dist/system.src.js'
    },
    packages: {
        'bx/forms': {
            defaultExtension: 'js'
        },
        'bx/preload': {
            defaultExtension: 'js'
        },
        'bx/cache': {
            defaultExtension: 'js'
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我决定在更好地理解SystemJ之后重新审视这个问题,并花了很多时间尝试不同的组合来解决问题。

经过多次努力之后,我非常恼火地发现尝试1 只需要进行一次小的更改才能使其正常工作(除非现在这样做的事实是由于systemjs更新?)

更改map的{​​{1}}值:

bx

为:

'bx/': '/src/bx'

解决了原来的问题。

'bx': '/src/bx',

答案 1 :(得分:0)

全局地图不会与全局地图链接,但它会与路径链接。

您可以尝试将bx/定义为路径:

System.config({ paths: { 'bx/': 'path/to/bx/' } })

然后使用map config作为此规则例外的单个条目:

System.config({ map: { 'bx/y': 'custom/location' } })