Ng-lazyload-image: рдХреЛрдгреАрдп рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдмрд┐рд▓реНрдб рдкреНрд░реАрд░реЗрдВрдбрд░ рддреНрд░реБрдЯрд┐

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЬрдире░ 2019  ┬╖  23рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tjoskar/ng-lazyload-image

  • рдореИрдВ рдПрдХ рдЬрдорд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ ...

    • [рдПрдХреНрд╕] рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ
    • [ ] рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓реЗрдЦ рдорд╛рдВрдЧрдирд╛
    • [ ] рд╕рдорд░реНрдерди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
  • рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
    рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдмрдЧ рдФрд░ рдПрдВрдЧреБрд▓рд░ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдмрд┐рд▓реНрдб рдкреНрд░реАрд░реЗрдВрдбрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛

  • рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
    рдЬрдм рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
    npm run build:prerender

рдпрд╣ рдЪрд▓рддрд╛ рд╣реИ:
"generate:prerender": "cd dist && node prerender",

рдлрд┐рд░ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓:
```/node_modules/ng-lazyload-image/src/lazyload-image.module.js:1
(рдлрд╝рдВрдХреНрд╢рди (рдирд┐рд░реНрдпрд╛рдд, рдЖрд╡рд╢реНрдпрдХрддрд╛, рдореЙрдбреНрдпреВрд▓, __filename, __dirname) {рдЖрдпрд╛рдд { NgModule } '@ рдХреЛрдгреАрдп/рдХреЛрд░' рд╕реЗ;
^^^^^^

рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрди рдЖрдпрд╛рдд
createScript рдкрд░ (vm.js:80:10)
Object.runInThisContext рдкрд░ (vm.js:139:10)
рдореЙрдбреНрдпреВрд▓._рдХрдВрдкрд╛рдЗрд▓ рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:617:28)
Object.Module._extensions..js рдкрд░ (module.js:664:10)
рдореЙрдбреНрдпреВрд▓.рд▓реЛрдб рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:566:32)
tryModuleLoad рдкрд░ (module.js:506:12)
Function.Module._load рдкрд░ (module.js:498:3)
рдореЙрдбреНрдпреВрд▓.рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:597:17)
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ (рдЖрдВрддрд░рд┐рдХ/рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:11:18)
Object.ng-lazyload-image/src/lazyload-image.module (/dist/server/main.js:1350:18) рдкрд░


* **provide the steps to reproduce**
1) Duplicate the Angular Universal starter project from:
https://github.com/angular/universal-starter

2) Add your library, following install instructions:
https://github.com/tjoskar/ng-lazyload-image

3) Run the Angular build command to see the error:
```npm run build:prerender```

* **What is the expected behavior?**
No error, and to continue building.

* **What is the motivation / use case for changing the behavior?**
Otherwise your plugin cannot be used with Angular Universal, which means no static site generation :(

* **Please tell us about your environment:**
  - MacOS 10.13.6
  - node 8.9.1
  - ng-cli 6.0.0 and tested with 7.1.4
  - angular 6.0.0 and tested with 7.1.4
  - nguniversal 6.0.0 and tested with 7.0.2

* **Other information**

Looks like other people have had similar problems with Angular Universal and third-party libraries such as yours:
https://github.com/angular/angular-cli/issues/7200#issuecomment-329711848

They say the third-party libraries aren't being built correctly, which means Angular Universal fails:
https://github.com/angular/angular-cli/issues/7200#issuecomment-328991769

for example they suggest adding to your package.json
```"main": "./bundles/quickstart-lib.umd.js",
"module": "./quickstart-lib.es5.js",
"es2015": "./quickstart-lib.js",
"typings": "./quickstart-lib.d.ts",

рджреГрд╖реНрдЯрд┐рдХреЛрдг 1
рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рд░реВрдЯ рдХреЛ рдкреИрдЪ рдХрд░реЗрдВ:
npm install @babel/cli @babel/core @babel/preset-env @babel/plugin-transform-modules-umd

рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдЬрдбрд╝ рдореЗрдВ рдПрдХ .babelrc рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдирд╛:

{
  "plugins": [["@babel/plugin-proposal-decorators", { "decoratorsBeforeExport": true }]],
  "presets": ["@babel/preset-env"]
}

рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ package.json

"main": "./lib-umd/index.js",
"module": "./lib-es5/index.js",
"es2015": "./lib/index.js",
"typings": "./lib/index.d.ts",
"scripts": {
  "build:umd": "babel ./lib/*.js --out-dir ./lib-umd --plugins @babel/plugin-transform-modules-umd",
  "build:es5": "babel ./lib/*.js --out-dir ./lib-es5"
}

рдлрд┐рд░ рдирд┐рд░реНрдорд╛рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ:
npm run build:es5 && npm run build:umd

рдФрд░ рдореЗрд░реЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ tsconfig.json рдореЗрдВ рдЬреЛрдбрд╝рдирд╛

"compilerOptions": {
  "paths": { "@angular/*": ["../node_modules/@angular/*"] },
}

рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреЛрдгреАрдп рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ :(

рджреГрд╖реНрдЯрд┐рдХреЛрдг 2
рдЙрджрд╛рд╣рд░рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд┐рд▓реНрдб рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
https://github.com/filipesilva/angular-quickstart-lib

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдХреЛрдгреАрдп рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реВрдВред @tjoskar рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ng-packagr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ? рдЖрдк рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ FESM2015, FESM5, рдФрд░ UMD рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдмрдирд╛ рдФрд░ рдмрдВрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://github.com/ng-packagr/ng-packaged/blob/master/package.json#L11 (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ng-packagr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ)ред

рд╕рднреА 23 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдгреАрдп рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ

``` node_modules\ng-lazyload-image\index.js:1
(рдлрд╝рдВрдХреНрд╢рди (рдирд┐рд░реНрдпрд╛рдд, рдЖрд╡рд╢реНрдпрдХрддрд╛, рдореЙрдбреНрдпреВрд▓, __filename, __dirname) {рдЖрдпрд╛рдд { LazyLoadImageDirective } './src/lazyload-image.directive' рд╕реЗ;
^^^^^^

рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐: рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрди рдЖрдпрд╛рдд
createScript рдкрд░ (vm.js:80:10)
Object.runInThisContext рдкрд░ (vm.js:139:10)
рдореЙрдбреНрдпреВрд▓._рдХрдВрдкрд╛рдЗрд▓ рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:617:28)
Object.Module._extensions..js рдкрд░ (module.js:664:10)
рдореЙрдбреНрдпреВрд▓.рд▓реЛрдб рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:566:32)
tryModuleLoad рдкрд░ (module.js:506:12)
Function.Module._load рдкрд░ (module.js:498:3)
рдореЙрдбреНрдпреВрд▓.рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ (рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:597:17)
рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ (рдЖрдВрддрд░рд┐рдХ/рдореЙрдбреНрдпреВрд▓.рдЬреЗрдПрд╕:11:18)
eval рдкрд░ (рд╡реЗрдмрдкреИрдХ:///external_%22ng-lazyload-image%22?:1:18) ```

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

import { Directive, ElementRef, Inject, Input, OnInit, PLATFORM_ID} from '@angular/core';
import { isPlatformBrowser } from '@angular/common';

@Directive({
  selector: '[appLazyLoadImage]'
})
export class LazyLoadImageDirective implements OnInit {
  @Input() srcLazy: string;

  constructor(
    private el: ElementRef,
    @Inject(PLATFORM_ID) private platformId: Object,
  ) { }

  ngOnInit() {
    // only run lazy image loading in the browser
    if (isPlatformBrowser(this.platformId)) {
      // if browser supports IntersectionObserver
      if ('IntersectionObserver' in window) {
        const lazyImageObserver = new IntersectionObserver((entries, observer) => {
          entries.forEach((entry) => {
            if (entry.isIntersecting) {
              entry.target.setAttribute('src', this.srcLazy);
              entry.target.classList.add('lazy-loaded');
              lazyImageObserver.unobserve(entry.target);
            }
          });
        });
        lazyImageObserver.observe(this.el.nativeElement);
      } else {
        // Otherwise replace image by default
        this.el.nativeElement.setAttribute('src', this.srcLazy);
      }
    }
  }

}

рдЗрд╕реЗ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВ:

import { LazyLoadImageDirective } from './lazy-load-image.directive';
...
@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [
    LazyLoadImageDirective
  ],
  exports: [
    CommonModule,
    LazyLoadImageDirective
  ]
})
...etc

рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
<img src="../assets/placeholder.jpg" srcLazy="../assets/myimage.jpg" alt="Example" appLazyLoadImage />

рдореБрдЭреЗ рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдгреАрдп рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ

(function (exports, require, module, __filename, __dirname) { import { LazyLoadImageDirective } from './src/lazyload-image.directive';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:617:28)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at eval (webpack:///external_%22ng-lazyload-image%22?:1:18) ```

рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЗрд╕реЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ

externals: [ nodeExternals({ whitelist: [ /^ng-lazyload-image/, ] })

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ angular universal рдХреЗрд╡рд▓ рдХреЙрдореЛрдирдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЪреВрдВрдХрд┐ ng-lazyload-image рдХреЗрд╡рд▓ рдИрдПрд╕-рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд▓рдХреНрд╖реНрдп angular universal рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ ng-lazyload-image рд▓рд┐рдП рдХрдИ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ @kmturley рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛрдЧрд╛ рдХрд┐ рдкреЗрдбрд╝ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред

@xmasuku , рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдк whitelist рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░рддреЗ рд╣реИрдВ?

@tjoskar рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдХреНрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛

рдореИрдВрдиреЗ рдПрдХ рдХреНрд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ

рдареАрдХ рд╣реИ, рдореИрдВ рдЖрдЬ рд░рд╛рдд рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛

рдореИрдВ рдХреЛрдгреАрдп рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реВрдВред @tjoskar рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ng-packagr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ? рдЖрдк рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ FESM2015, FESM5, рдФрд░ UMD рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдмрдирд╛ рдФрд░ рдмрдВрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: https://github.com/ng-packagr/ng-packaged/blob/master/package.json#L11 (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ng-packagr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ)ред

// рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдореБрджреНрджрд╛ рд╣реИред https://github.com/angular/angular-cli/issues/7200
// рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдпрд╣ рд╕реЗрдЯрдЕрдк рд╣реИ
// рдЗрд╕реЗ рдмрджрд▓реЗрдВ: --- " рд╕рдВрдХрд▓рди: рд╕рд░реНрд╡рд░ ": "tsc -p server.tsconfig.json"
// рдЗрд╕рдХреЗ рд╕рд╛рде: --- " рд╕рдВрдХрд▓рди: рд╕рд░реНрд╡рд░ ": "рдиреЛрдб --max_old_space_size=3072 node_modules/webpack/bin/webpack.js --config webpack.server.config.js --progress --colors"

// рдлрд┐рд░ webpack.server.config.js рдмрдирд╛рдПрдВ рдиреАрдЪреЗ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  mode: 'none',
  entry: {
    // This is our Express server for Dynamic universal
    server: './server.ts'
  },
  target: 'node',
  resolve: { extensions: ['.ts', '.js'] },
  externals: [ nodeExternals({
    whitelist: [
        /^ng-lazyload-image/,
    ]
  }), /.*?webpack.*?/i ],
  optimization: {
    minimize: false
  },
  output: {
    // Puts the output at the root of the dist folder
    path: path.join(__dirname, 'dist'),
    filename: '[name].js'
  },
  module: {
    rules: [
      { test: /\.ts$/, loader: 'ts-loader' },
      {
        // Mark files inside `@angular/core` as using SystemJS style dynamic imports.
        // Removing this will cause deprecation warnings to appear.
        test: /(\\|\/)@angular(\\|\/)core(\\|\/).+\.js$/,
        parser: { system: true },
      },
    ]
  },
  plugins: [
    new webpack.ContextReplacementPlugin(
      // fixes WARNING Critical dependency: the request of a dependency is an expression
      /(.+)?angular(\\|\/)core(.+)?/,
      path.join(__dirname, 'src'), // location of your src
      {} // a map of your routes
    ),
    new webpack.ContextReplacementPlugin(
      // fixes WARNING Critical dependency: the request of a dependency is an expression
      /(.+)?express(\\|\/)(.+)?/,
      path.join(__dirname, 'src'),
      {}
    )
  ]
};

// рдореЗрд░рд╛ рд╕рд░реНрд╡рд░.ts

```
рдЖрдпрд╛рдд 'zone.js/dist/zone-node';
{enableProdMode} рдХреЛ '@angular/core' рд╕реЗ рдЗрдВрдкреЛрд░реНрдЯ рдХрд░реЗрдВ;
// рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдЗрдВрдЬрди
'@nguniversal/express-engine' рд╕реЗ {ngExpressEngine} рдЖрдпрд╛рдд рдХрд░реЗрдВ;
// рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдореИрдк рдЖрдпрд╛рдд рдХрд░реЗрдВ
'@nguniversal/module-map-ngfactory-loader' рд╕реЗ {provideModuleMap} рдЖрдпрд╛рдд рдХрд░реЗрдВ;

рдЖрдпрд╛рдд * 'рдПрдХреНрд╕рдкреНрд░реЗрд╕' рд╕реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ;
'рдкрде' рд╕реЗ {рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ} рдЖрдпрд╛рдд рдХрд░реЗрдВ;

// рддреЗрдЬрд╝ рд╕рд░реНрд╡рд░ w / рдЙрддреНрдкрд╛рдж рдореЛрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рджреЗрд╡ рдореЛрдб рдХреА рдХрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА)
рд╕рдХреНрд╖рдордкреНрд░реЛрдбрдореЛрдб ();

// рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рд░реНрд╡рд░
рдХреЙрдиреНрд╕реНрдЯ рдРрдк = рдПрдХреНрд╕рдкреНрд░реЗрд╕ ();

рдХреЙрдиреНрд╕реНрдЯ рдкреЛрд░реНрдЯ = process.env.PORT || 4000;
const DIST_FOLDER = рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ (рдкреНрд░рдХреНрд░рд┐рдпрд╛.cwd (), 'рдЬрд┐рд▓рд╛/рдмреНрд░рд╛рдЙрдЬрд╝рд░');

// * рдиреЛрдЯ :: рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЫреЛрдбрд╝ рджреЗрдВ () рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╡реЗрдмрдкреИрдХ рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ
const {AppServerModuleNgFactory, LAZY_MODULE_MAP} = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('./dist/server/main');

// рд╣рдорд╛рд░рд╛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рдЗрдВрдЬрди (рдорд┐рд▓рд╛ @ https://github.com/angular/universal/tree/master/modules/express-engine)
рдРрдк.рдЗрдВрдЬрди ('рдПрдЪрдЯреАрдПрдордПрд▓', рдПрдирдЬреАрдПрдХреНрд╕рдкреНрд░реЗрд╕рдЗрдВрдЬрд┐рди ({
рдмреВрдЯрд╕реНрдЯреНрд░реИрдк: AppServerModuleNgFactory,
рдкреНрд░рджрд╛рддрд╛: [
рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдореЙрдбреНрдпреВрд▓рдореИрдк(LAZY_MODULE_MAP)
]
}));

app.set ('рдЗрдВрдЬрди рджреЗрдЦреЗрдВ', 'рдПрдЪрдЯреАрдПрдордПрд▓');
app.set ('рд╡рд┐рдЪрд╛рд░', DIST_FOLDER);

// рдЙрджрд╛рд╣рд░рдг рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдмрд╛рдХреА рдПрдкреАрдЖрдИ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ
// app.get('/api/ *', (req, res) => { });// /рдмреНрд░рд╛рдЙрдЬрд╝рд░ . рд╕реЗ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░реЗрдВapp.get(' .*', рдПрдХреНрд╕рдкреНрд░реЗрд╕.рд╕реНрдЯреИрдЯрд┐рдХ (DIST_FOLDER, {
рдЕрдзрд┐рдХрддрдо рдЖрдпреБ: '1 рд╡рд░реНрд╖'
}));

// рд╕рднреА рдирд┐рдпрдорд┐рдд рдорд╛рд░реНрдЧ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
app.get('*', (req, res) => {
res.render ('рдЗрдВрдбреЗрдХреНрд╕', {req});
});

// рдиреЛрдб рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ
app.listen (рдкреЛрд░реНрдЯ, () => {
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ( Node Express server listening on http://localhost:${PORT} );
});

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@tjoskar рдореИрдВрдиреЗ рдЖрдкрдХреА рд╢рд╛рдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рд▓реНрдб рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╡рд┐рд▓рдп рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ?

@Loutrinos , рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдХреНрдпрд╛ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП [email protected] (рдмреАрдЯрд╛) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

@tjoskar рдореИрдВ 5.1.0 рд░рд┐рд▓реАрдЬ рдореЗрдВ
5.1.0 рдХреЛрдгреАрдп рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЕрдм рдФрд░ рдирд╣реАрдВ рдЯреВрдЯрддрд╛ :P

@ рд▓реВрдЯреНрд░реАрдиреЛ ,

рдореИрдВ 5.1.0 рд░рд┐рд▓реАрдЬ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдЕрд▓рдЧ рд╣реИ

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд░рд┐рд▓реАрдЬрд╝ ([email protected]) рдмрдирд╛рдИред рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХрд╛рдлреА рд╡реНрдпрд╕реНрдд рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

5.1.1 рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ:
ReferenceError: IntersectionObserver is not defined

@agustinarifa рдЖрдкрдХреА tsconfig.json рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ?

рдореИрдВрдиреЗ рдЕрднреА рдпрд╣ рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рд╣реИ: https://github.com/tjoskar/ng-lazyload-image-bugs/tree/master/370-universal-starter-compile рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ https://github.com/angular/universal-starter рдХреНрд▓реЛрди рдХрд┐рдпрд╛, ng-lazyload-image (npm install [email protected]) рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдПрдХ рдЫрд╡рд┐ рдЬреЛрдбрд╝реА , npm run build:prerender рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдлрд┐рд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛: node dist/server.js ред

рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @tjoskar
рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдмрджрд▓ рджрд┐рдП рд╣реИрдВред
рдРрдк рдореЗрдВред рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: LazyLoadImageModule.forRoot({}),
рдФрд░ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ: LazyLoadImageModule.forRoot({ preset: intersectionObserverPreset, }),

рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛, рдкрд╣рд▓реА рдЫрд╡рд┐ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ рд╢реАрд░реНрд╖ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо 1px рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рджреВрд╕рд░рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рдкрд╣рд▓реЗ 200px рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рд╣рдореНрдо .. рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ LazyLoadImageModule рдореЗрдВ app.module рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд░реЗрдкреЛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)ред

@agustintarifa , рдСрдлрд╝рд╕реЗрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдХреНрдпрд╛ рдЖрдк рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдореБрджреНрджрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдирдорд╕реНрддреЗ, рд╣рдо v5.1.1 рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдмреАрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдм рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ SSR рд╕реЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

@ vytautas-pranskunas-, рдореИрдВ рдЗрд╕реЗ рдХрд▓ рдХреБрдЫ рдЕрдиреНрдп рдЫреЛрдЯреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рдХрд░реВрдВрдЧрд╛ред

рд╕рд┐рдВрдбреНрд╕ рдЧреНрд░реЗрдЯ

рд╕реЛрдо рдкрд░, 1 рдЕрдкреНрд░реИрд▓ 2019, 9:17 рдЕрдкрд░рд╛рд╣реНрди рдСрд╕реНрдХрд░ рдХрд╛рд░реНрд▓рд╕рди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@vytautas-pranskunas- https://github.com/vytautas-pranskunas- , рдореИрдВ рдХрд░реВрдВрдЧрд╛
рдЗрд╕реЗ рдХрд▓ рдХреБрдЫ рдЕрдиреНрдп рдЫреЛрдЯреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рдХрд░реЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/tjoskar/ng-lazyload-image/issues/370#issuecomment-478709421 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ADvMl18aKahOsS6vr4C4h4Tagwy2p4TNks5vclsrgaJpZM4Z0lGg
.

[email protected] рдЕрдм рдмрд╛рд╣рд░ рд╣реИред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рд╣реЛрддреА рд╣реИред

@tjoskar рдореИрдВ 6.0.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдВ рдЬрд╛рд░реА рд╣реИред

// app.module.ts

LazyLoadImageModule.forRoot({
  preset: intersectionObserverPreset
}),

рдФрд░ рдЬрдм рдореИрдВрдиреЗ SSR рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛:

ReferenceError: IntersectionObserver is not defined

рд░реЗрдлрд░реА #396

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕