首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CycleJS加载SystemJS

用CycleJS加载SystemJS
EN

Stack Overflow用户
提问于 2017-03-31 04:28:12
回答 1查看 111关注 0票数 1

我试图通过SystemJS从他们的CDN加载循环DOM,内容如下:

代码语言:javascript
复制
System.config({
  map: {
    'cycle-dom': 'https://unpkg.com/@cycle/dom@17.1.0/dist/cycle-dom.js',
    'xstream': 'https://cdnjs.cloudflare.com/ajax/libs/xstream/10.3.0/xstream.min.js',
  }
});

System.import('cycle-dom', cycleDOM => {
    ...
});

但我很快发现循环-多玛需要xstream。所以我试着把两个都装上:

代码语言:javascript
复制
Promise.all([
  System.import('xstream'),
  System.import('cycle-dom')
])
.then(([xs, cycleDOM]) => {
  ...
});

但我还是会犯同样的错误。看起来,cycle-dom希望xstream在第一次加载时就存在于window上。所以我试着:

代码语言:javascript
复制
System.import('xstream')
  .then(xs => window['xstream'] = xs)
  .then(() => System.import('cycle-dom'))
  .then(cycleDOM => {
    ...
  });

我觉得我搞错了。我该怎么做?

更新:

按照martin下面的建议,我尝试将xstream配置为cycle-dom的依赖项。

这里有一个jsbin演示了。我正在做的是加载循环运行和循环-dom,然后在循环主页上运行这个示例。

但我知道错误是:

"TypeError:无法读取未定义的属性‘默认’“

在本例中未定义的是cycle-dom试图加载未加载的window['xstream']

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 10:15:18

System.import()调用返回一个承诺,因此需要将回调放入其then()方法(第二个参数是父名,而不是回调)。

代码语言:javascript
复制
System.import('cycle-dom').then(function(cycleDOM) {
  console.log(cycleDOM);
});

这将打印模块导出。

我对cycle.js没有任何经验,所以我无法判断这是否足够。尽管如此,您仍然可以使用meta配置设置这个包依赖项:

代码语言:javascript
复制
System.config({
  map: {
    'cycle-dom': 'https://unpkg.com/@cycle/dom@17.1.0/dist/cycle-dom.js',
    'xstream': 'https://cdnjs.cloudflare.com/ajax/libs/xstream/10.3.0/xstream.min.js',
  },
  meta: {
    'cycle-dom': {
      deps: [
        'xstream'
      ]
    }
  }
});

再说一次,我不知道这是否足够。SystemJS文档包含解释得很好的示例,如何加载需要注册一些全局变量的依赖项。请参阅https://github.com/systemjs/systemjs/blob/master/docs/module-formats.md#shim-dependencies

编辑:

在这种情况下,情况就更复杂了。cycle-run.js脚本可能是由browserify生成的,您可以看到它包含如下一行:

代码语言:javascript
复制
var xstream_1 = (typeof window !== "undefined" ? window['xstream'] : typeof global !== "undefined" ? global['xstream'] : null);

这将检查window['xstream']在加载时是否存在。这意味着在加载xstream脚本之前必须加载cycle-run.js。SystemJS的工作方式是加载请求的模块,然后加载它的依赖项(您可以在开发人员工具中看到顺序)。因此,这是与您所需要的相反的顺序(这非常类似于我在SystemJS GitHub页面上的问题)。

这意味着您需要重组导入调用:

代码语言:javascript
复制
System.config({
  // ...
  meta: {
    'xstream': {
      format: 'global',
      exports: 'xstream',
    }
  }
});

System.import('xstream').then(function() {
  Promise.all([
    System.import('cycle-run'),
    System.import('cycle-dom'),
  ])
  .then(([cycle, cycleDOM]) => {
    // ...
  });
});

这将在加载xstream之前注册cycle-run。同样,对于meta配置的xstream,这可以确保window.xstream只存在于这些回调中,并且不会泄漏到全局范围。

请参阅您的更新演示:https://jsbin.com/qadezus/35/edit?js,output

此外,要使用formatexports,您需要使用更新的SystemJS 0.20.*,而不是0.19.*

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43132475

复制
相关文章

相似问题

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