Skip to main content

基于 CDN 开发

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

介绍

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

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

unpkg:

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

jsdelivr:

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

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

unpkg:

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

jsdelivr:

<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:

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

jsdelivr:

<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的版本

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

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

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

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

<canvas id="canvas" style="width: 100%;height: auto"></canvas>

<script src="https://unpkg.com/@eva/eva.js@1.x/dist/EVA.min.js"></script>
<script src="https://unpkg.com/pixi.js@4.8.9/dist/pixi.min.js"></script>
<script src="https://unpkg.com/@eva/renderer-adapter@1.x/dist/EVA.rendererAdapter.min.js"></script>
<script src="https://unpkg.com/@eva/plugin-renderer@1.x/dist/EVA.plugin.renderer.min.js"></script>
<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 文件

const { Game, GameObject, resource, RESOURCE_TYPE } = EVA;
const { RendererSystem } = EVA.plugin.renderer;
const { Img, ImgSystem } = EVA.plugin.renderer.img;
resource.addResource([
{
name: 'imageName',
type: RESOURCE_TYPE.IMAGE,
src: {
image: {
type: 'png',
url:
'https:////gw.alicdn.com/bao/uploaded/TB1lVHuaET1gK0jSZFhXXaAtVXa-200-200.png',
},
},
preload: true,
},
]);

const game = new Game({
systems: [
new RendererSystem({
canvas: document.querySelector('#canvas'),
width: 750,
height: 1000,
}),
new ImgSystem(),
],
});

const image = new GameObject('image', {
size: { width: 300, height: 300 },
origin: { x: 0, y: 0 },
position: {
x: 100,
y: 100,
}
});

image.addComponent(
new Img({
resource: 'imageName',
}),
);

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

转换方法

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

function transform(pkgName) {
if (pkgName === '@eva/eva.js') {
return 'EVA';
} else if (pkgName === '@eva/plugin-evax') {
return 'EVA.plugin.EVAX'
} else if (pkgName.indexOf('@eva/plugin') === 0) {
let name = pkgName.substring(12);
name = name.replace('-', '.')
const [a, b] = name.split('-')
if (b) {
name = a+b[0].toUpperCase()+b.substring(1)
}
return `EVA.plugin.${name}`;
}
}

console.log(transform('@eva/eva.js'))
console.log(transform('@eva/plugin-transition'))
console.log(transform('@eva/plugin-renderer'))
console.log(transform('@eva/plugin-renderer-img'))
console.log(transform('@eva/plugin-renderer-sprite-animation'))
console.log(transform('@eva/plugin-renderer-tiling-sprite'))
console.log(transform('@eva/plugin-evax'))