프로젝트 구조, 수명 주기, 번들

미니 앱 프로젝트 구조

앞서 마크업 언어, 스타일 지정 언어, 구성요소와 마찬가지로 미니 앱 프로젝트 구조를 사용하면 파일 확장자 또는 기본 이름과 같은 세부정보가 달라집니다. 하지만 전반적인 아이디어는 모든 슈퍼 앱 제공업체에 대해 동일합니다. 프로젝트 구조는 항상 다음으로 구성됩니다.

  • 미니 앱을 초기화하는 루트 파일 app.js
  • 웹 앱 매니페스트대략적으로 상응하는 구성 파일 app.json입니다.
  • 공유된 기본 스타일이 포함된 선택적 공통 스타일 시트 파일 app.css입니다.
  • 빌드 정보가 포함된 project.config.json 파일입니다.

모든 페이지는 pages 폴더의 개별 하위 폴더에 저장됩니다. 각 페이지 하위 폴더에는 CSS 파일, JS 파일, HTML 파일, 구성 JSON 파일(선택사항)이 포함됩니다. 모든 파일의 이름은 파일 확장자를 제외하고 포함 폴더와 동일해야 합니다. 마찬가지로 미니 앱에는 app.json 파일(매니페스트와 유사한 파일)의 디렉터리 포인터만 있으면 되며 모든 하위 리소스를 동적으로 찾을 수 있습니다. 따라서 웹 개발자의 관점에서 미니 앱은 멀티 페이지 앱입니다.

├── app.js               # Initialization logic
├── app.json             # Common configuration
├── app.css              # Common style sheet
├── project.config.json  # Project configuration
└── pages                # List of pages
   ├── index               # Home page
   │   ├── index.css         # Page style sheet
   │   ├── index.js          # Page logic
   │   ├── index.json        # Page configuration
   │   └── index.html        # Page markup
   └── other               # Other page
       ├── other.css         # Page style sheet
       ├── other.js          # Page logic
       ├── other.json        # Page configuration
       └── other.html        # Page markup

미니 앱 수명 주기

미니 앱은 전역적으로 정의된 App() 메서드를 호출하여 슈퍼 앱에 등록되어야 합니다. 앞에 설명된 프로젝트 구조를 참고하면 app.js에서 이 작업이 실행됩니다. 미니 앱 수명 주기는 기본적으로 launch, show, hide, error의 4가지 이벤트로 구성됩니다. 이러한 이벤트의 핸들러는 App() 메서드에 구성 객체의 형태로 전달될 수 있습니다. 이 객체에는 모든 페이지에서 전역적으로 사용할 수 있어야 하는 데이터를 보유한 globalData 속성도 포함될 수 있습니다.

/* app.js */
App({
  onLaunch(options) {
    // Do something when the app is launched initially.
  },
  onShow(options) {
    // Do something when the app is shown.
  },
  onHide() {
    // Do something when the app is hidden.
  },
  onError(msg) {
    console.log(msg);
  },
  globalData: "I am global data",
});

일반적으로 개별 세부정보는 다르지만 WeChat, Alipay, Baidu, ByteDance, Quick App의 개념은 동일합니다.

페이지 수명 주기

앱 수명 주기와 마찬가지로 페이지 수명 주기에도 개발자가 수신 대기하고 반응할 수 있는 수명 주기 이벤트가 있습니다. 이러한 핵심 이벤트는 load, show, ready, hide, unload입니다. 일부 플랫폼은 pulldownrefresh와 같은 추가 이벤트를 제공합니다. 이벤트 핸들러 설정은 각 페이지에 정의된 Page() 메서드에서 이루어집니다. 이전 프로젝트 구조의 index 또는 other 페이지의 경우 각각 index.js 또는 other.js에서 발생합니다.

/* index.js */
Page({
  data: {
    text: "This is page data.",
  },
  onLoad: function (options) {
    // Do something when the page is initially loaded.
  },
  onShow: function () {
    // Do something when the page is shown.
  },
  onReady: function () {
    // Do something when the page is ready.
  },
  onHide: function () {
    // Do something when the page is hidden.
  },
  onUnload: function () {
    // Do something when the page is closed.
  },
  onPullDownRefresh: function () {
    // Do something when the user pulls down to refresh.
  },
  onReachBottom: function () {
    // Do something when the user scrolls to the bottom.
  },
  onShareAppMessage: function () {
    // Do something when the user shares the page.
  },
  onPageScroll: function () {
    // Do something when the user scrolls the page.
  },
  onResize: function () {
    // Do something when the user resizes the page.
  },
  onTabItemTap(item) {
    // Do something when the user taps the page's tab.
  },
  customData: {
    foo: "bar",
  },
});

빌드 프로세스

미니 앱의 빌드 프로세스는 개발자로부터 추상화됩니다. 내부적으로는 변환 및 축소를 위해 Babel 컴파일러와 postcss CSS 변환기와 같은 업계 도구를 사용합니다. 빌드 환경은 개발자가 명시적으로 선택하지 않는 한 빌드 매개변수를 건드리지 않는 Next.js 또는 create-react-app와 유사합니다. 처리된 결과 파일은 최종적으로 서명되고 암호화되며 하나 이상의 (하위) 패키지로 패키징된 후 슈퍼 앱 제공업체의 서버에 업로드됩니다. 하위 패키지는 지연 로드를 위한 것이므로 미니 앱을 한 번에 모두 다운로드할 필요가 없습니다. 패키징 세부정보는 비공개이며 문서화되어 있지 않지만 WeChat의 wxapkg 형식과 같은 일부 패키지 형식은 리버스 엔지니어링되었습니다.

감사의 말씀

이 도움말은 조 미들리, 케이스 바스케스, 밀리차 미하일리아, 앨런 켄트, 케이스 구님이 검토했습니다.