Ng-lazyload-image: ParseError: '๊ฐ€์ ธ์˜ค๊ธฐ' ๋ฐ '๋‚ด๋ณด๋‚ด๊ธฐ'๋Š” 'sourceType: module'๊ณผ ํ•จ๊ป˜๋งŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 05์›” 19์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: tjoskar/ng-lazyload-image

์—ฌ๋ณด์„ธ์š”!
Ionic 2 ํ”„๋กœ์ ํŠธ์—์„œ Angular 2๋กœ ์ž‘์—… ์ค‘์ด๊ณ  LazyLoad๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

my_file.js
import {Component, Input} from "angular2/core";
import {LazyLoadImageDirective} from "ng2-lazyload-image/index";

@Component({
    selector: 'image',
    template: `
        <img src="images/placeholder_big" [lazyLoad]="image" offset="50">
    `,
    directives: [LazyLoadImageDirective]
})
class ImageComponent {
    @Input('src') image;
}
export {ImageComponent}
/Users/lobetia/repo/ionic2_migration/node_modules/ng2-lazyload-image/index.ts:1
import {LazyLoadImageDirective} from './src/lazyload-image.directive';
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module'

/index๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
import {LazyLoadImageDirective} from "ng2-lazyload-image";
๋น„์Šทํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

/Users/lobetia/repo/ionic2_migration/node_modules/ng2-lazyload-image/src/lazyload-image.directive.ts:1
import 'rxjs/add/observable/fromEvent';
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module'

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ๊ณ  ์ด ๋ชจ๋“ˆ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋„์™€์ฃผ์‹œ๊ฒ ์–ด์š” ๐Ÿ˜ฐ ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ง€์‹œ๋ฌธ์ด ๋‹ฌ๋ฆฌ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด window ์— ๋Œ€ํ•œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋กค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ div์ด๊ธฐ ๋•Œ๋ฌธ์— ionic ์•ฑ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ฆ‰

<ion-content #container>
  <img [scrollTarget]="container._scrollEle" ...>
</ion-content>

์œ„์˜ ์˜ˆ์™€ # 2๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”,

๋‹น์‹ ์˜ ์„ค์ •์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? babel ๋˜๋Š” typescript์™€ ํ•จ๊ป˜ Ionic์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ tsconfig.json ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ๋…ธ๋“œ 5.4์—์„œ [email protected] ๋ฅผ ์‚ฌ์šฉ
๋‚˜๋Š” typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด tsconfig.json์€

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "filesGlob": [
    "**/*.ts",
    "!node_modules/**/*"
  ],
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ],
  "compileOnSave": false,
  "atom": {
    "rewriteTsconfig": false
  }
}

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ typescript๋Š” ์ปดํŒŒ์ผ๋œ .js ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  ์†Œ์Šค ํŒŒ์ผ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์†”๋ฃจ์…˜์€ npm์—์„œ ์†Œ์Šค ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ:

$ ionic start MyIonic2Project tutorial --v2 --ts

๊ทธ๋Ÿฐ ๋‹ค์Œ /app/pages/hello-ionic/hello-ionic.ts ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

import { Page } from 'ionic-angular';
import { LazyLoadImageDirective } from 'ng2-lazyload-image';

@Page({
  templateUrl: 'build/pages/hello-ionic/hello-ionic.html',
  directives: [ LazyLoadImageDirective ]
})
export class HelloIonicPage {
    defaultImage: string;
    image: string;
    offset: number;

    constructor() {
        this.defaultImage = 'https://www.placecage.com/1000/500';
        this.image = 'https://images.unsplash.com/photo-1443890923422-7819ed4101c0?fm=jpg';
        this.offset = 100;
    }
}

/app/pages/hello-ionic/hello-ionic.html :

<ion-navbar *navbar>
  <button menuToggle>
    <ion-icon name="menu"></ion-icon>
  </button>
  <ion-title>Hello Ionic</ion-title>
</ion-navbar>

<ion-content padding class="getting-started" #container>
  <p style="height: 1000px;">
      This starter project comes with simple tabs-based layout for apps
      that are going to primarily use a Tabbed UI.
    </p>
    <img
      [src]="defaultImage"
      [lazyLoad]="image"
      [offset]="offset"
      [scrollTarget]="container._scrollEle">
</ion-content>

์ด์ œ [email protected] ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ง€์‹œ๋ฌธ์ด ๋‹ฌ๋ฆฌ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด window ์— ๋Œ€ํ•œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋กค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ div์ด๊ธฐ ๋•Œ๋ฌธ์— ionic ์•ฑ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ฆ‰

<ion-content #container>
  <img [scrollTarget]="container._scrollEle" ...>
</ion-content>

์œ„์˜ ์˜ˆ์™€ # 2๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค, ๋‹น์‹ ์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค!
img-lazy ๊ตฌ์„ฑ ์š”์†Œ์— ๋ชจ๋“  ๊ฒƒ์„ ํฌ์žฅํ–ˆ์œผ๋ฉฐ ์ด๋ฏธ์ง€์˜ ํŽ˜์ด๋“œ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ผ๋ถ€ ์˜คํ”„๋ผ์ธ ์บ์‹ฑ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ด ๋ฌธ์ œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ๋งˆ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘ ๐Ÿ‘

๋‹คํ–‰์ด๋‹ค!

์ด๋ฏธ์ง€์˜ ํŽ˜์ด๋“œ์ธ์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ์กฐ๊ธˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ๋‹น์‹ ์ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ng2-lazyloading ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋˜๊ณ  ng2-lazyloaded ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ฆ‰

// Before loaded
<img [lazyLoad]="image" class="ng2-lazyloading">

// After loaded
<img [lazyLoad]="image" class="ng2-lazyloaded">

https://github.com/tjoskar/ng2-lazyload-image/blob/a227020c52af0fc30b6683e05c4f4a57f67b13ce/example/image.component.ts#L14 ๋ฐ ๋ฌผ๋ก  ์†Œ์Šค ์ฝ”๋“œ: https://github.com /tjoskar/ng2-lazyload-image/blob/8e8f7d46ebad227c4584594b32d0ac9b1945a74e/src/lazyload-image.directive.ts#L77

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์˜คํ”„๋ผ์ธ ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ๊ฒƒ์„ ๋งŒ๋“ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š” ;)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰