Hướng Dẫn Chi Tiết Cấu Hình Tệp pages.json Cho Uni-App

Tệp pages.json đóng vai trò trung tâm trong việc thiết lập các tham số toàn cục cho ứng dụng uni-app. Nó chịu trách nhiệm xác định lộ trình các tệp trang, phong cách cửa sổ, thanh điều hướng gốc và thanh tabbar ở dưới cùng.

Về chức năng, nó chia sẻ điểm tương đồng với phần quản lý trang trong app.json của微信小程序 (WeChat Mini Program). Tuy nhiên, cần lưu ý rằng các yêu cầu quyền như định vị vốn thuộc về app.json trong môi trường gốc, thì trong uni-app sẽ được cấu hình within tệp manifest.

Danh Sách Các Thuộc Tính Cấu Hình

Bảng dưới đây tổng hợp các thuộc tính chính có thể sử dụng trong tệp cấu hình:

Thuộc tính Kiểu dữ liệu Mô tả Tương thích nền tảng
globalStyle Object Không Thiết lập biểu hiện cửa sổ mặc định cho các trang -
pages Object Array Định nghĩa đường dẫn trang và phong cách cửa sổ -
easycom Object Không Quy tắc tự động nhập thành phần 2.5.5+
tabBar Object Không Cấu hình hiển thị cho thanh tab dưới cùng -
condition Object Không Cấu hình chế độ khởi động -
subPackages Object Array Không Cấu hình tải gói phụ (subpackage) -
preloadRule Object Không Quy tắc tải trước cho gói phụ WeChat Mini Program
workers String Không Thư mục chứa mã Worker WeChat Mini Program
leftWindow Object Không Cửa sổ bên trái cho màn hình lớn H5
topWindow Object Không Cửa sổ phía trên cho màn hình lớn H5
rightWindow Object Không Cửa sổ bên phải cho màn hình lớn H5
uniIdRouter Object Không Cấu hình liên quan đến chuyển hướng tự động -

Dưới đây là một ví dụ minh họa bao gồm hầu hết các tùy chọn cấu hình trong pages.json:

{
  "pages": [
    {
      "path": "views/home/main",
      "style": {
        "navigationBarTitleText": "Trang Chủ"
      }
    },
    {
      "path": "views/services/list",
      "style": {
        "navigationBarTitleText": "Dịch Vụ"
      }
    },
    {
      "path": "views/services/detail",
      "style": {
        "navigationBarTitleText": "Chi Tiết"
      }
    }
  ],
  "condition": {
    "current": 0,
    "list": [
      {
        "name": "mode_test",
        "path": "views/services/detail"
      }
    ]
  },
  "globalStyle": {
    "navigationBarTextStyle": "white",
    "navigationBarTitleText": "Ứng Dụng Demo",
    "navigationBarBackgroundColor": "#007AFF",
    "backgroundColor": "#F5F5F5",
    "usingComponents": {
      "nav-header": "/components/nav-header"
    },
    "pageOrientation": "portrait",
    "rpxCalcMaxDeviceWidth": 960,
    "rpxCalcBaseDeviceWidth": 375
  },
  "tabBar": {
    "color": "#999999",
    "selectedColor": "#007AFF",
    "borderStyle": "white",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "views/home/main",
        "iconPath": "static/icons/home.png",
        "selectedIconPath": "static/icons/home_active.png",
        "text": "Trang Chủ"
      },
      {
        "pagePath": "views/services/list",
        "iconPath": "static/icons/service.png",
        "selectedIconPath": "static/icons/service_active.png",
        "text": "Dịch Vụ"
      }
    ]
  },
  "easycom": {
    "autoscan": true,
    "custom": {
      "^my-(.*)": "@/components/my-$1.vue"
    }
  },
  "topWindow": {
    "path": "layouts/top-bar.vue",
    "style": {
      "height": "60px"
    }
  },
  "leftWindow": {
    "path": "layouts/sidebar.vue",
    "style": {
      "width": "250px"
    }
  },
  "rightWindow": {
    "path": "layouts/info-panel.vue",
    "style": {
      "width": "300px"
    },
    "matchMedia": {
      "minWidth": 900
    }
  }
}

globalStyle

Phần này dùng để thiết lập thanh trạng thái, thanh điều hướng, tiêu đề và màu nền cửa sổ cho toàn bộ ứng dụng.

Thuộc tính Kiểu Giá trị mặc định Mô tả Ghi chú nền tảng
navigationBarBackgroundColor HexColor #F7F7F7 Màu nền thanh điều hướng APP và H5 mặc định là #F7F7F7
navigationBarTextStyle String white Màu tiêu đề thanh điều hướng, chỉ hỗ trợ black/white Alipay Mini Program không hỗ trợ
navigationBarTitleText String - Nội dung văn bản tiêu đề -
navigationStyle String default Phong cách thanh điều hướng (default/custom) Custom để ẩn thanh gốc
backgroundColor HexColor #ffffff Màu nền cửa sổ khi kéo xuống WeChat Mini Program
enablePullDownRefresh Boolean false Bật tính năng kéo để làm mới -
pageOrientation String portrait Cấu hình xoay màn hình (auto/portrait/landscape) App, WeChat, QQ
usingComponents Object - Tham chiếu các thành phần mini program -

Lưu ý: Khi sử dụng titleImage trên Alipay Mini Program, bắt buộc phải dùng liên kết https. Thuộc tính maxWidth yêu cầu các phần tử fixed trong trang sử dụng biến css --window-left--window-right để đảm bảo bố cục.

Cấu Hình Cửa Sổ Responsive (topWindow, leftWindow, rightWindow)

Từ phiên bản uni-app 2.9+, các cấu hình này được thêm vào để giải quyết vấn đề thích ứng màn hình rộng. Bên cạnh cửa sổ chính (mainWindow), bạn có thể thêm các khung hiển thị ở trái, trên hoặc phải.

Thuộc tính Kiểu Mô tả
path String Đường dẫn đến trang cấu hình
style Object Cấu hình hiển thị cửa sổ (width, height...)
matchMedia Object Quy tắc hiển thị dựa trên kích thước màn hình

Ví dụ cấu hình matchMedia:

Thuộc tính Kiểu Mặc định Mô tả
minWidth Number 768 Hiển thị cửa sổ khi độ rộng vùng nhìn thấy >= giá trị này

Đoạn mã mẫu cho cấu hình cửa sổ:

{
  "pages": [
    {
      "path": "views/auth/login",
      "style": {
        "topWindow": false,
        "leftWindow": false
      }
    }
  ],
  "rightWindow": {
    "path": "layouts/right-panel.vue",
    "style": {
      "width": "280px"
    },
    "matchMedia": {
      "minWidth": 1024
    }
  }
}

pages

Node pages xác định cấu trúc trang của ứng dụng. Nó nhận một mảng, mỗi phần tử là một đối tượng chứa thông tin về một trang cụ thể.

Thuộc tính Kiểu Mô tả
path String Đường dẫn trang (không cần đuôi file)
style Object Cấu hình window style cho trang này

Mẹo: Phần tử đầu tiên trong mảng pages được coi là trang khởi động (homepage). Khi thêm hoặc xóa trang, cần cập nhật mảng này.

Ví dụ cấu trúc thư mục:

┌─views
│  ├─home
│  │  └─main.vue
│  └─auth
│     └─login.vue
├─static
├─main.js
└─pages.json

Tương ứng trong pages.json:

{
  "pages": [
    {
      "path": "views/home/main",
      "style": { }
    },
    {
      "path": "views/auth/login",
      "style": { }
    }
  ]
}

style (Cấu hình từng trang)

Các thiết lập trong phần style của từng trang sẽ ghi đè lên các配置 tương tự trong globalStyle.

Thuộc tính Kiểu Mặc định Mô tả
navigationBarBackgroundColor HexColor #000000 Màu nền thanh điều hướng
disableScroll Boolean false Ngăn cuộn trang (chỉ có hiệu lực trong cấu hình trang)
navigationBarTitleText String - Tiêu đề trang
enablePullDownRefresh Boolean false Bật kéo làm mới

Ví dụ:

{
  "pages": [{
    "path": "views/home/main",
    "style": {
      "navigationBarTitleText": "Tổng Quan",
      "enablePullDownRefresh": true
    }
  }]
}

Lưu ý khi tùy chỉnh thanh điều hướng

Khi đặt navigationStylecustom, thanh điều hướng gốc sẽ ẩn. Trên các thiết bị không phải H5, vùng trạng thái (status bar) có thể bị nội dung trang che khuất. Bạn có thể sử dụng biến css --status-bar-height để tạo khoảng đệm.

<template>
  <view>
    <view class="status_placeholder"></view>
    <view>Nội dung bên dưới </view>
  </view>
</template>
<style>
  .status_placeholder {
    height: var(--status-bar-height);
    width: 100%;
  }
</style>

app-plus (Cấu hình riêng cho App)

Cho phép thiết lập các style đặc thù khi biên dịch sang nền tảng App.

Thuộc tính Kiểu Mô tả
background HexColor Màu nền窗体 gốc
titleNView Object Cấu hình thanh điều hướng
pullToRefresh Object Cấu hình kéo làm mới
softinputMode String Chế độ bàn phím (adjustResize/adjustPan)

titleNView (Thanh điều hướng)

Cung cấp khả năng tùy biến sâu cho thanh điều hướng trên App.

Thuộc tính Kiểu Mô tả
type String default/transparent/float
buttons Array Danh sách nút tùy chỉnh
searchInput Object Cấu hình ô tìm kiếm
backgroundImage String Ảnh nền hoặc gradient

Ví dụ cấu hình titleNView:

{
  "pages": [{
    "path": "views/news/feed",
    "style": {
      "app-plus": {
        "titleNView": {
          "type": "transparent",
          "searchInput": {
            "placeholder": "Tìm kiếm tin tức",
            "backgroundColor": "#ffffff"
          },
          "buttons": [
            {
              "text": "Đăng"
            }
          ]
        }
      }
    }
  }]
}

subNVues (原生子窗体)

Là các窗体 con gốc được nhúng vào trang vue, giúp xử lý các vấn đề về层级 (z-index) và tùy biến giao diện gốc linh hoạt hơn.

{
  "pages": [{
    "path": "views/map/view",
    "style": {
      "app-plus": {
        "subNVues": [{
          "id": "nav_overlay",
          "path": "views/map/nav.nvue",
          "style": {
            "position": "dock",
            "height": "50px"
          }
        }]
      }
    }
  }]
}

easycom (Tự động nhập thành phần)

Từ HBuilderX 2.5.5, chế độ easycom cho phép sử dụng component mà không cần import hay đăng ký thủ công, chỉ cần tuân thủ quy tắc đặt tên thư mục.

Ví dụ sử dụng component tự động:

<template>
  <view class="box">
    <my-list>
      <my-list-item title="Mục 1"></my-list-item>
      <my-list-item title="Mục 2"></my-list-item>
    </my-list>
  </view>
</template>
<script>
  export default {
    data() {
      return {}
    }
  }
</script>

Cấu hình tùy chỉnh trong pages.json:

"easycom": {
  "autoscan": true,
  "custom": {
    "^my-(.*)": "@/components/my-$1.vue",
    "^lib-(.*)": "package-name/lib-$1.vue"
  }
}

tabBar (Thanh điều hướng dưới)

Dùng cho các ứng dụng có nhiều tab. Cấu hình này giúp tăng hiệu suất render trên App và Mini Program vì được xử lý bởi engine gốc.

Thuộc tính Bắt buộc Mô tả
color Màu chữ mặc định
selectedColor Màu chữ khi chọn
backgroundColor Màu nền thanh tab
list Mảng các tab (tối thiểu 2, tối đa 5)
position Không bottom hoặc top (top chỉ hỗ trợ WeChat)

Ví dụ cấu hình tabBar:

"tabBar": {
  "color": "#888888",
  "selectedColor": "#FF5722",
  "backgroundColor": "#FFFFFF",
  "list": [{
    "pagePath": "views/home/main",
    "iconPath": "static/tab/home.png",
    "selectedIconPath": "static/tab/home_sel.png",
    "text": "Trang Chủ"
  }, {
    "pagePath": "views/user/profile",
    "iconPath": "static/tab/user.png",
    "selectedIconPath": "static/tab/user_sel.png",
    "text": "Cá Nhân"
  }]
}

condition (Chế độ khởi động)

Chỉ có hiệu lực trong quá trình phát triển, dùng để mô phỏng việc mở thẳng vào một trang cụ thể (ví dụ: từ link chia sẻ).

"condition": {
  "current": 0,
  "list": [{
    "name": "direct_to_detail",
    "path": "views/product/detail",
    "query": "id=123&source=share"
  }]
}

subPackages (Phân chia gói)

Cơ chế分包加载 giúp tối ưu kích thước và tốc độ khởi động cho Mini Program. Gói chính chứa trang khởi động, các gói phụ chứa trang con.

Cấu trúc ví dụ:

┌─views
│  └─index
├─modules
│  ├─shop
│  └─user
└─pages.json

Cấu hình pages.json:

{
  "pages": [{
    "path": "views/index/home",
    "style": {}
  }],
  "subPackages": [{
    "root": "modules/shop",
    "pages": [{
      "path": "product/list",
      "style": {}
    }]
  }, {
    "root": "modules/user",
    "pages": [{
      "path": "settings/index",
      "style": {}
    }]
  }]
}

preloadRule (Quy tắc tải trước)

Cho phép tải trước các gói phụ khi người dùng vào một trang tertentu, giúp chuyển trang nhanh hơn.

"preloadRule": {
  "views/index/home": {
    "network": "all",
    "packages": ["modules/shop"]
  }
}

Câu Hỏi Thường Gặp (FAQ)

Hỏi: Làm sao để ẩn thanh điều hướng gốc?

Đáp: Đặt navigationStyle thành custom trong phần style của trang hoặc globalStyle. Lưu ý xử lý vùng trạng thái (status bar) thủ công.

Hỏi: Cấu hình quyền định vị ở đâu?

Đáp: Không cấu hình trong pages.json. Hãy sử dụng tệp manifest.json để khai báo các quyền năng cho Mini Program.

Thẻ: uni-app pages.json mobile-configuration cross-platform vuejs

Đăng vào ngày 2 tháng 7 lúc 01:36