基于 CDN 开发

基于 CDN 开发,我们推荐使用 start-demo-with-cdn,这个脚手架使用了 Webpack 的 Externals 能力,将 Eva.js 包用 CDN 的方式引入。

介绍

如果希望通过 CDN 的形式引入 Eva.js,可以使用 unpkg/jsdelivr 进行引入。

以下是 @eva/eva.js 的引入方案

unpkg:

  1. <script src="https://unpkg.com/browse/@eva/eva.js@1.x/dist/EVA.min.js"></script>

jsdelivr:

  1. <script src="https://cdn.jsdelivr.net/npm/@eva/eva.js@1.x/dist/EVA.min.js"></script>

dist目录下提供了压缩版本和调试版本。去掉.min使用调试版本

unpkg:

  1. <script src="https://unpkg.com/browse/@eva/eva.js@1.x/dist/EVA.js"></script>

jsdelivr:

  1. <script src="https://cdn.jsdelivr.net/npm/@eva/eva.js@1.x/dist/EVA.js"></script>

如需引入不同版本的Eva.js,详情请进入unpkg 官网 / jsdelivr 官网查看方案

插件的使用

Eva.js 的每个插件都是一个 npm 包,所以每个插件都需要引入一个cdn文件

例如:图片插件

unpkg:

  1. <script src="https://cdn.jsdelivr.net/npm/@eva/plugin-renderer-img@1.x/dist/EVA.plugin.renderer.img.js"></script>

jsdelivr:

  1. <script src="https://cdn.jsdelivr.net/npm/@eva/plugin-renderer-img@1.x/dist/EVA.plugin.renderer.img.js"></script>

渲染

Eva.js v1.x 版本的渲染是由 PixiJS 提供的,所以需要先引入 PixiJS cdn。 目前使用的是pixi4.x的版本

  1. <script src="https://unpkg.com/pixi.js@4.8.9/dist/pixi.min.js"></script>

Eva.js v1.x 的渲染需要一层adapter支持,所以也需要引入renderer-adapter

  1. <script src="//unpkg.com/@eva/renderer-adapter@1.1.x/dist/EVA.rendererAdapter.min.js"></script>

所以渲染一张图片完整所需要的cdn文件有:

  1. <canvas id="canvas" style="width: 100%;height: auto"></canvas>
  2. <script src="https://unpkg.com/@eva/eva.js@1.x/dist/EVA.min.js"></script>
  3. <script src="https://unpkg.com/pixi.js@4.8.9/dist/pixi.min.js"></script>
  4. <script src="https://unpkg.com/@eva/renderer-adapter@1.x/dist/EVA.rendererAdapter.min.js"></script>
  5. <script src="https://unpkg.com/@eva/plugin-renderer@1.x/dist/EVA.plugin.renderer.min.js"></script>
  6. <script src="https://unpkg.com/@eva/plugin-renderer-img@1.x/dist/EVA.plugin.renderer.img.min.js"></script></head>

编码

使用 CDN 开发时,我们把 Eva.js 的各个变量和类挂在了window上面。 先举个简单的例子,我们假设已经引入了图片所需要的 CDN 文件

  1. const { Game, GameObject, resource, RESOURCE_TYPE } = EVA;
  2. const { RendererSystem } = EVA.plugin.renderer;
  3. const { Img, ImgSystem } = EVA.plugin.renderer.img;
  4. resource.addResource([
  5. {
  6. name: 'imageName',
  7. type: RESOURCE_TYPE.IMAGE,
  8. src: {
  9. image: {
  10. type: 'png',
  11. url:
  12. 'https:////gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png',
  13. },
  14. },
  15. preload: true,
  16. },
  17. ]);
  18. const game = new Game({
  19. systems: [
  20. new RendererSystem({
  21. canvas: document.querySelector('#canvas'),
  22. width: 750,
  23. height: 1000,
  24. }),
  25. new ImgSystem(),
  26. ],
  27. });
  28. const image = new GameObject('image', {
  29. size: { width: 300, height: 300 },
  30. origin: { x: 0, y: 0 },
  31. position: {
  32. x: 100,
  33. y: 100,
  34. }
  35. });
  36. image.addComponent(
  37. new Img({
  38. resource: 'imageName',
  39. }),
  40. );
  41. game.scene.addChild(image);

规则

我们可以发现,变量挂载的规则和npm包名的规则类似,其中 @eva/eva.js 对应的是 EVA 其余插件也的都挂载到了 EVA 变量上

例如:

@eva/plugin-transition -> EVA.plugin.transition

@eva/plugin-renderer -> EVA.plugin.renderer

@eva/plugin-renderer-img -> EVA.plugin.renderer.img

@eva/plugin-renderer-sprite -> EVA.plugin.renderer.sprite

我们可以看到,其实把 - 变成了 .

组件名字中有连字符的,例如 nine-patch / sprite-animation / tiling-sprite 我们把组件名写成了驼峰的形式

@eva/plugin-renderer-nine-patch -> EVA.plugin.renderer.ninePatch

@eva/plugin-renderer-sprite-animation -> EVA.plugin.renderer.spriteAnimation

@eva/plugin-renderer-tiling-sprite -> EVA.plugin.renderer.tilingSprite

EvaX 组件最为特殊

@eva/plugin-evax -> EVA.plugin.EVAX

转换方法

可以通过以下方法进行转换

  1. function transform(pkgName) {
  2. if (pkgName === '@eva/eva.js') {
  3. return 'EVA';
  4. } else if (pkgName === '@eva/plugin-evax') {
  5. return 'EVA.plugin.EVAX'
  6. } else if (pkgName.indexOf('@eva/plugin') === 0) {
  7. let name = pkgName.substring(12);
  8. name = name.replace('-', '.')
  9. const [a, b] = name.split('-')
  10. if (b) {
  11. name = a+b[0].toUpperCase()+b.substring(1)
  12. }
  13. return `EVA.plugin.${name}`;
  14. }
  15. }
  16. console.log(transform('@eva/eva.js'))
  17. console.log(transform('@eva/plugin-transition'))
  18. console.log(transform('@eva/plugin-renderer'))
  19. console.log(transform('@eva/plugin-renderer-img'))
  20. console.log(transform('@eva/plugin-renderer-sprite-animation'))
  21. console.log(transform('@eva/plugin-renderer-tiling-sprite'))
  22. console.log(transform('@eva/plugin-evax'))