方案
我正在使用具有特定命名空间的代码库。但部分代码库是本地的,其他几个部分是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'
}
}
}
答案 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' } })