1

I have a problem where I need to use a specific 3rd party library to generate a nonce to use the square connect api. I am having troubles finding how to load the external javascript library since they don't have a node_module that I can load like I usually do. By external library I mean something like this <script src="https://js.squareup.com/v2/paymentform " type="text/javascript"> I have not found a good way to to load this into my application so that I can use it. Any ideas on how I can solve this problem?

2

2 Answers 2

1

A few options that I have used:

  1. Global script using angular-cli

    "scripts": [
       "global-script.js",
       { "input": "lazy-script.js", "lazy": true },
       { "input": "pre-rename-script.js", "output": "renamed-script" },
    ]
    
  2. Require in a specific module

    import { NgModule } from '@angular/core';
    ...
    require('chart.js');
    require('../../libs/chartjs-plugin-annotation');
    ...
    
  3. Add a global script at runtime based on some condition

    if (this.usesCKEditor(permissions) && !window['CKEDITOR']) {
        const url = '//cdn.ckeditor.com/4.7.3/full/ckeditor.js';
        const script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = url;
        document.body.appendChild(script);
    }
    // must check if the script has loaded before using it
    
Sign up to request clarification or add additional context in comments.

7 Comments

On option number one do you have to download the script first or can I put the link url?
@JonathanJensen just an FYI, you aren't allowed (by Square) to download the script and include it, so options like number 3 are going to be better for you.
@JonathanJensen you can put the url in option 1 also
@tristansokol Thanks for the update. I am aware of them not allowing the downloading of their scripts which is why I asked the question. But if I did not know about it then that would have been helpful. So thank you.
@SumamaWaheed When I try option number one I get this error: ERROR in multi script-loader!./src/https:/js.squareup.com/v2/paymentform Module not found: Error: Can't resolve '/Users/jpjensen/Projects/build-a-bracelet/front-end/src/https:/js.squareup.com/v2/paymentform' in '/Users/jpjensen/Projects/build-a-bracelet/front-end/node_modules/@angular/cli/models/webpack-configs' @ multi script-loader!./src/https:/js.squareup.com/v2/paymentform code gist.github.com/jonje/703071339542964bed461742f10c5c90
|
1

First Approach:

Refer the scripts inside the angular-cli.json file.

"scripts": [
    "../path" 
 ];

Second Approach

You can create your own directive to load script as below

import { Directive, OnInit, Input } from '@angular/core';

@Directive({
    selector: '[appLoadScript]'
})
export class LoadScriptDirective implements OnInit{

    @Input('script') param:  any;

    ngOnInit() {
        let node = document.createElement('script');
        node.src = this.param;
        node.type = 'text/javascript';
        node.async = false;
        node.charset = 'utf-8';
        document.getElementsByTagName('head')[0].appendChild(node);
    }

}

HOW TO USE

<i appLoadScript  [script]="'https://js.squareup.com/v2/paymentform'"></i>

DEMO

1 Comment

Second approach works well, but I prefer the first one. Is there a way to make use of environment variables with the first approach? I need to inject in an API key.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.