Skip to content

Commit 06007f0

Browse files
Merge pull request #21 from puzzle-js/asset-defer-loader
asset defer loader added
2 parents b4c946b + 9ae93ba commit 06007f0

File tree

3 files changed

+51
-37
lines changed

3 files changed

+51
-37
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@puzzle-js/client-lib",
33
"main": "dist/index.js",
4-
"version": "1.4.0",
4+
"version": "1.4.1",
55
"author": "<[email protected]>",
66
"license": "MIT",
77
"repository": {

src/assetHelper.ts

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,60 @@
11
import {IPageLibAsset} from "./types";
22

33
export class AssetHelper {
4-
static loadJs(asset: IPageLibAsset): Promise<any> | null {
5-
let loader: Promise<any> | null = null;
6-
const scriptTag: any = window.document.createElement('script');
7-
if (!window.document.querySelector(`[puzzle-asset="${asset.name}"]`)) {
8-
scriptTag.type = 'text/javascript';
9-
scriptTag.setAttribute('puzzle-asset', asset.name);
10-
scriptTag.src = asset.link;
11-
scriptTag.defer = asset.defer || false;
12-
scriptTag.crossOrigin = "anonymous";
13-
14-
if (!asset.defer) {
15-
loader = new Promise((resolve) => {
16-
scriptTag.onload = () => {
17-
resolve();
18-
};
4+
static promises: Record<string, {
5+
resolve: () => void,
6+
reject: () => void,
7+
promise: Promise<any>
8+
}> = {};
9+
10+
static createDeferred() {
11+
let resolve, reject: any;
12+
const promise = new Promise((r, rej) => {
13+
resolve = r;
14+
reject = rej;
1915
});
20-
}
2116

22-
window.document.body.appendChild(scriptTag);
23-
} else {
24-
return null;
17+
return {
18+
promise,
19+
resolve: resolve as any,
20+
reject: reject as any
21+
};
22+
}
23+
24+
static loadJs(asset: IPageLibAsset): Promise<any> {
25+
const scriptTag: any = window.document.createElement('script');
26+
27+
if (!this.promises[asset.name]) {
28+
this.promises[asset.name] = this.createDeferred();
29+
scriptTag.type = 'text/javascript';
30+
scriptTag.setAttribute('puzzle-asset', asset.name);
31+
scriptTag.src = asset.link;
32+
scriptTag.defer = asset.defer || false;
33+
scriptTag.crossOrigin = "anonymous";
34+
35+
if (!asset.defer) {
36+
scriptTag.onload = () => {
37+
this.promises[asset.name].resolve();
38+
};
39+
} else {
40+
this.promises[asset.name].resolve();
41+
}
42+
43+
window.document.body.appendChild(scriptTag);
44+
}
45+
46+
return this.promises[asset.name].promise;
2547
}
2648

27-
return loader;
28-
}
29-
30-
static loadJsSeries(scripts: IPageLibAsset[]) {
31-
for (let i = 0, p: any = Promise.resolve(); i < scripts.length; i++) {
32-
p = p.then(() => new Promise(resolve => {
33-
const assetLoading = AssetHelper.loadJs(scripts[i]);
34-
if (!assetLoading) {
35-
resolve();
36-
} else {
37-
assetLoading.then(() => {
38-
resolve();
39-
});
40-
}
49+
static loadJsSeries(scripts: IPageLibAsset[]) {
50+
for (let i = 0, p: any = Promise.resolve(); i < scripts.length; i++) {
51+
p = p.then(() => new Promise(resolve => {
52+
const assetLoading = AssetHelper.loadJs(scripts[i]);
53+
assetLoading.then(() => {
54+
resolve();
55+
});
56+
}
57+
));
4158
}
42-
));
4359
}
44-
}
4560
}

test/assetHelper.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ describe('Module - Asset Helper', () => {
4848
const result = AssetHelper.loadJs(asset);
4949

5050
// assert
51-
expect(result).to.eq(null);
5251
expect(global.window.document.body.children.length).to.eq(1);
5352
});
5453

0 commit comments

Comments
 (0)