javascript - 使用基于角度的 json + 环境在 head 标签中加载第三方 js
问题描述
我想在 HEAD 标记中添加我的谷歌分析 JS。所以我可以尝试使用 angular.json 进行配置
"scripts": [
"src/assets/js/jquery-3.4.1.min.js",
"src/assets/js/general.js",
{ "input": "src/assets/js/google-analytics.js", "lazy": false }
]
但是,不是在head标签中添加,所有js都添加在body标签的末尾。
另一种选择是,将直接添加到 index.html 中。但我需要根据环境添加基础。
如果有任何方法可以直接使用angular.json在 HEAD 标签中添加 JS,请分享
解决方案
从资产外部加载 js 文件
创建服务文件将文件添加到资产并在数组中写入路径。
import { Injectable } from "@angular/core";
import { Injectable } from "@angular/core";
declare var document: any;
@Injectable({
providedIn:'root'
})
export class ScriptService {
private scripts: any = {};
constructor() {
ScriptConstant.forEach((script: any) => {
this.scripts[script.name] = {
loaded: false,
src: script.src
};
});
}
load(...scripts: string[]) {
var promises: any[] = [];
scripts.forEach(script => promises.push(this.loadScript(script)));
return Promise.all(promises);
}
loadAll() {
var promises: any[] = [];
ScriptConstant.forEach(script => {
// promises.push(delay(1000));
promises.push(this.loadScript(script.name));
});
return Promise.all(promises);
}
loadScript(name: string) {
return new Promise((resolve, reject) => {
//resolve if already loaded
if (this.scripts[name].loaded) {
resolve({ script: name, loaded: true, status: "Already Loaded" });
} else {
//load script
let script = document.createElement("script");
script.type = "text/javascript";
script.src = this.scripts[name].src;
if (script.readyState) {
//IE
script.onreadystatechange = () => {
if (
script.readyState === "loaded" ||
script.readyState === "complete"
) {
script.onreadystatechange = null;
this.scripts[name].loaded = true;
resolve({ script: name, loaded: true, status: "Loaded" });
}
};
} else {
//Others
script.onload = () => {
this.scripts[name].loaded = true;
resolve({ script: name, loaded: true, status: "Loaded" });
};
}
script.onerror = (error: any) =>
resolve({ script: name, loaded: false, status: "Loaded" });
document.getElementsByTagName("body")[0].appendChild(script);
}
});
}
}
interface Scripts {
name: string;
src: string;
}
export const ScriptConstant: Scripts[] = [
{ name: "multislider", src: "assets/js/multislider.js" },
];
在需要的地方注入这个 ScriptService 并像这样加载 js 库
this.script.load('multislider').then(data => {
console.log('script loaded ', data);
}).catch(error => console.log(error));
推荐阅读
- django - 按天分组,然后再按用户分组以获取对象列表或对象 ID
- javascript - 在 Ag-grid 中编辑标题
- symfony - maximilienGilet/notification-bundle 出错
- polymer - 将手势事件添加到自定义元素 Polymer 2.0
- html - 视频标签不显示 Angular 5 的 webrtc 流视频
- amazon-web-services - Cakephp 登录 AWS Elastic Beanstalk
- android - LiveData 和 ViewModel 不更新 textview
- spring-data - 使用 SpringData 从 Aerospike 获取多个值
- ios - MTLBuffer分配+CPU/GPU同步
- matlab - 周长凸度计算 - Matlab