【问题标题】:Load third party js in head tag using angular json + environment based使用基于角度的 json + 环境在 head 标签中加载第三方 js
【发布时间】:2020-01-29 17:09:20
【问题描述】:

我想在 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,请分享

【问题讨论】:

  • 是的,但是我正在搜索带有环境条件的 angular.json 的直接解决方案(如果有的话)。否则可以使用 angular.json 的 index.html + 文件替换选项或这些重复问题的答案。谢谢

标签: javascript json angular typescript


【解决方案1】:

从assets外部加载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));

【讨论】:

  • 此服务的行为与启动时直接将脚本构建到 index.html 中的行为不同。该服务实际上会引入延迟,并且在服务运行之前不会将脚本注入 index.html。而且这个答案没有回答关于使用angular.json加载脚本的问题。
【解决方案2】:

尝试将您的 JavaScript 文件添加到我们主应用程序的 index.html 文件中的 head 标签顶部。

你会在 project-name/src/index.html 找到它

【讨论】:

  • 抱歉,我知道,可以使用 index.html。但我正在寻找具有环境条件的动态解决方案
猜你喜欢
  • 2016-06-05
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多