首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以覆盖SystemJS配置中的别名?

是否可以覆盖SystemJS配置中的别名?
EN

Stack Overflow用户
提问于 2016-04-20 09:48:42
回答 2查看 1.4K关注 0票数 3

场景

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

问题

我正在试图找出是否有可能在SystemJS配置中“覆盖”映射别名?我遇到的问题是,我想为库的本地版本声明一个基本别名,然后为npm模块声明更具体的映射别名。

尝试1

起初,我认为这样做是可能的:

代码语言:javascript
复制
{
    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‘子’模块:

代码语言:javascript
复制
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/中代码的每个映射别名和包。i.e

代码语言:javascript
复制
{
    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无需单独列出maps中的所有bx路径作为唯一值,但仍然需要在packages中单独列出它们。

代码语言:javascript
复制
{
    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'
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-01-25 16:14:01

在对SystemJ有了更好的理解之后,我决定重新讨论这个问题,并花费了相当长的时间尝试不同的组合来解决这个问题。

在经历了大量的绞尽脑汁之后,我恼怒地发现,尝试1只需要一个小的更改就可以工作(除非现在的工作是由于系统was的更新?)

从以下位置更改bxbx值:

'bx/': '/src/bx'

至:

'bx': '/src/bx',

解决了原来的问题。

代码语言:javascript
复制
{
    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'
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-29 12:29:19

全局映射不使用全局映射,但它使用路径链接。

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

代码语言:javascript
复制
System.config({ paths: { 'bx/': 'path/to/bx/' } })

然后,对属于此规则例外的单个条目使用map配置:

代码语言:javascript
复制
System.config({ map: { 'bx/y': 'custom/location' } })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36739971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档