Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以覆盖SystemJS配置中的映射别名?_Javascript_Systemjs - Fatal编程技术网

Javascript 是否可以覆盖SystemJS配置中的映射别名?

Javascript 是否可以覆盖SystemJS配置中的映射别名?,javascript,systemjs,Javascript,Systemjs,场景 我正在使用一个具有特定名称空间的代码库。但代码库的一部分是本地的,其他几个部分是npm模块,它们都属于同一名称空间 问题 我正在尝试确定是否可以在SystemJS配置中“覆盖”映射别名?我遇到的问题是,我想为库的本地版本声明一个基本别名,然后为npm模块声明更具体的映射别名 尝试1 起初我认为这样做是可能的: { bundles: { 'bx/google/drive': ['bx/google/drive/files', 'bx/google/drive/perm

场景

我正在使用一个具有特定名称空间的代码库。但代码库的一部分是本地的,其他几个部分是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
“子”模块:

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
类都是
未定义的
。(我还必须显式定义所有包导入路径)

迄今为止的解决方案

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

{
    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/
code(
bx:'src/bx'
)定义一个“基本”映射别名,然后为
bx
npm模块使用更具体的映射别名覆盖它


**更新**

将基本
bx/
添加到
路径
后,无需在
映射
中将所有
bx
路径单独列为唯一值,但它们仍然需要在
中单独列出

{
    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'
        }
    }
}

全局贴图不会与全局贴图链接,但会与路径链接

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

System.config({ paths: { 'bx/': 'path/to/bx/' } })
然后对属于此规则例外的单个条目使用映射配置:

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

在对SystemJs有了更好的理解之后,我决定重新讨论这个问题,并花了大量时间尝试不同的组合来解决这个问题

在经历了许多令人头疼的事情之后,我恼火地发现,尝试1只需要一个小的更改就可以工作(除非现在可以工作的事实是由于systemjs更新?)

bx
map
值更改为:

“bx/”:“/src/bx”

致:

'bx':'/src/bx',

解决了原来的问题

{
    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/
路径单独添加到
map
,但如果它们在
包中未单独列出,则会失败