Angular 7: Uncaught ReferenceError: global is not defined when adding package

前端 未结 3 592
借酒劲吻你
借酒劲吻你 2020-12-17 10:58

I am building an Angular 7 app, and when i add a package npm install dragula --save and import this into the pollyfills.ts file i get this error:

相关标签:
3条回答
  • 2020-12-17 11:17

    In my vision the best solution is to add this code in your index.html for testing

    <script>
      if (global === undefined) {
        var global = window;
      }
    </script>
    

    And this code to build for production (install domino ... with npm install first)

    const domino = require('domino');
    const fs = require('fs');
    const path = require('path');
    const template = fs
      .readFileSync(path.join('dist/browser', 'index.html'))
      .toString();
    const window = domino.createWindow(template);
    
    // Ignite UI browser objects abstractions
    (global as any).window = window;
    (global as any).document = window.document;
    (global as any).Event = window.Event;
    (global as any).KeyboardEvent = window.KeyboardEvent;
    (global as any).MouseEvent = window.MouseEvent;
    (global as any).FocusEvent = window.FocusEvent;
    (global as any).PointerEvent = window.PointerEvent;
    (global as any).HTMLElement = window.HTMLElement;
    (global as any).HTMLElement.prototype.getBoundingClientRect = () => {
        return {
          left: '',
          right: '',
          top: '',
          bottom: ''
      };
    };
    
    // If using IgxIconService to register icons
    (global as any).XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
    
    // Other optional depending on your application configuration
    (global as any).object = window.object;
    (global as any).navigator = window.navigator;
    (global as any).localStorage = window.localStorage;
    (global as any).DOMTokenList = window.DOMTokenList;
    
    0 讨论(0)
  • 2020-12-17 11:19

    Do you have custom webpack configuration for browser? Most probably declared in angular.json like so:

    ...
    "build": {
      "builder": "@angular-builders/custom-webpack:browser",
      "options": {
        "customWebpackConfig": {
        "path": "./webpack.browser.config.js"
      },
      ...
    

    Then webpack.browser.config.js might look like so:

    const dotenv = require("dotenv-webpack");
    const webpackConfig = {
      node: { global: true, fs: "empty" }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
      output: {
        libraryTarget: "umd", // Fix: "Uncaught ReferenceError: exports is not defined".
      },
      plugins: [new dotenv()],
      target: "node",
    };
    
    module.exports = webpackConfig; // Export all custom Webpack configs.
    

    Remove from its config target: "node" - it solves the problem.

    0 讨论(0)
  • 2020-12-17 11:29

    I had a similar problem few weeks ago, and I solve it when I change few setts in polyfills.ts now It look like:

    /**
     * This file includes polyfills needed by Angular and is loaded before the app.
     * You can add your own extra polyfills to this file.
     *
     * This file is divided into 2 sections:
     *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
     *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
     *      file.
     *
     * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
     * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
     * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
     *
     * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
     */
    
    /***************************************************************************************************
     * BROWSER POLYFILLS
     */
    
    /** IE9, IE10 and IE11 requires all of the following polyfills. **/
    // import 'core-js/es6/symbol';
    // import 'core-js/es6/object';
    // import 'core-js/es6/function';
    // import 'core-js/es6/parse-int';
    // import 'core-js/es6/parse-float';
    // import 'core-js/es6/number';
    // import 'core-js/es6/math';
    // import 'core-js/es6/string';
    // import 'core-js/es6/date';
    // import 'core-js/es6/array';
    // import 'core-js/es6/regexp';
    // import 'core-js/es6/map';
    // import 'core-js/es6/weak-map';
    // import 'core-js/es6/set';
    
    /** IE10 and IE11 requires the following for NgClass support on SVG elements */
    // import 'classlist.js';  // Run `npm install --save classlist.js`.
    
    /** IE10 and IE11 requires the following for the Reflect API. */
    // import 'core-js/es6/reflect';
    
    
    /** Evergreen browsers require these. **/
    // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
    import 'core-js/es7/reflect';
    
    
    /**
     * Required to support Web Animations `@angular/platform-browser/animations`.
     * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
     **/
    import 'web-animations-js';  // Run `npm install --save web-animations-js`.
    
    /**
     * By default, zone.js will patch all possible macroTask and DomEvents
     * user can disable parts of macroTask/DomEvents patch by setting following flags
     */
    
     // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
     // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
     // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
    
     /*
     * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
     * with the following flag, it will bypass `zone.js` patch for IE/Edge
     */
    // (window as any).__Zone_enable_cross_context_check = true;
    
    /***************************************************************************************************
     * Zone JS is required by default for Angular itself.
     */
    import 'zone.js/dist/zone';  // Included with Angular CLI.
    
    
    
    /***************************************************************************************************
     * APPLICATION IMPORTS
     */
    
    (window as any)['global'] = window;
    

    Try with this setts and let me know.

    Look also in your app.module.ts - did you import Dragula in good way?

    @NgModule({
        declarations: [
            ...
        ],
        imports: [
            ...
            DragulaModule.forRoot(),
            ...
        ],
        exports: [
            ...
        ],
        providers: [
           ...    ],
        bootstrap: [AppComponent]
    })
    

    Please note that this should be a main app.module.ts for your app, not any child or lazy loaded module.

    0 讨论(0)
提交回复
热议问题