前言
小程序配置文件主要有如下几个,这里按重要性分必须和非必须两部分。如下: 必须: main.js、App.vue、pages.json、manifest.json、
非必须: uni.scss、env、package.json、vue.config.js
通过对HBuilderX开发小程序的配置文件,全部解析一遍,有益于立足全局的开发思维模式,提高对项目开发的把控力度。
1、main.js 入口文件
是uni-app的入口文件,主要作用是初始化vue实例、使用需要的插件如vuex。 a、引入Vue库和App.vue,创建vue实例,并且挂载vue实例。 b、使用Vue.use引用插件,使用Vue.prototype添加全局变量。
import Vue from 'vue'
import App from './App'
App.mpType = 'app'
Vue.config.productionTip = false
import {
report,
sign_pv_report,
sign_ev_report
} from '@/track/report.js'
Vue.prototype.$report = report
Vue.prototype.$pvSignReport = sign_pv_report
Vue.prototype.$evSignReport = sign_ev_report
import uView from 'uview-ui'
Vue.use(uView);
const app = new Vue({
...App
})
import httpInterceptor from '@/api/http.interceptor.js';
Vue.use(httpInterceptor, app);
app.$mount()
2、App.vue 页面入口文件
1、定义:是uni-app的主组件,所有页面都是在App.vue下进行切换的,是页面入口文件。但App.vue本身不是页面,这里不能编写视图元素。 2、作用:调用应用生命周期函数、配置全局样式、配置全局的存储globalData
2.1、应用生命周期
uni-app 支持 onLaunch、onShow、onHide 等应用生命周期函数。 注意事项: 1、应用生命周期仅可在App.vue中监听,在页面监听无效。 2、App.vue 不能写模板。
简单应用关注以下三个生命周期函数就够:
<script>
export default {
onLaunch: function() {
console.log('App Launch,app启动')
},
onShow: function() {
console.log('App Show,app展现在前台')
},
onHide: function() {
console.log('App Hide,app不再展现在前台')
},
}
</script>
其他生命周期函数:
<script>
export default {
onError: function(options) {
console.log('onError:当uni-app报错时触发')
console.log(options)
},
onUniNViewMessage: function(options) {
console.log('onUniNViewMessage:对 nvue 页面发送的数据进行监听')
console.log(options)
},
onUnhandledRejection: function(options) {
console.log('onUnhandledRejection:对未处理的 Promise 拒绝事件监听函数(2.8.1+)')
console.log(options)
},
onPageNotFound: function(options) {
console.log('onPageNotFound:页面不存在监听函数')
console.log(options)
},
onThemeChange: function(options) {
console.log(':onThemeChange监听系统主题变化')
console.log(options)
},
}
</script>
2.2、globalData
小程序有globalData,是一种简单的全局变量机制。 这套机制在uni-app里也可以使用,并且全端通用。
以下是 App.vue 中定义globalData的相关配置:
<script>
export default {
globalData: {
text: 'text'
},
methods: {
}
}
</script>
注意点: 1、通常js中操作globalData的方式如下: getApp().globalData.text = ‘test’。 2、不要在定义 App() 的函数中,或调用 App 前调用 getApp() ,可以通过 this.$scope 获取对应的app实例。 3、通过 getApp() 获取实例之后,不要私自调用生命周期函数。 4、当在首页nvue中使用getApp()不一定可以获取真正的App对象。对此提供了 const app = getApp({allowDefault: true}) 用来获取原始的App对象,可以用来在首页对globalData等初始化。 5、如果需要把globalData的数据绑定到页面上,可在页面的onShow页面生命周期里进行变量重赋值(如:获取定位信息,监听网络状态)。
2.3、全局样式
在App.vue中,可以定义一些全局通用样式,例如需要加一个通用的背景色,首屏页面渲染的动画等都可以写在App.vue中。 注意:如果工程下同时有vue和nvue文件,此时需要把nvue不支持的css写在单独的条件编译里。如:
<style lang="scss">
@import './common/uni.css';
</style>
3、pages.json 全局配置
用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 它类似微信小程序中app.json的页面管理部分。但注意的是:定位权限申请等原属于app.json的内容,在uni-app中是在manifest中配置实现。
这里取几个主要的配置进行说明:
3.1、pages 页面路由配置
这是唯一一个 必须配置的项。
uni-app 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象。
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "custom"
}
}, {
"path": "pages/login/auth",
"style": {
"navigationBarTitleText": "custom"
}
}
]
}
注意: 1、pages节点的第一项为应用入口页(即首页)。 2、应用中新增/减少页面,都需要对 pages 数组进行修改。 3、文件名不需要写后缀,框架会自动寻找路径下的页面资源。
3.2、globalStyle 应用统一样式配置
设置默认页面的窗口表现
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#FFFFFF",
"backgroundColor": "#f5f5f5",
"navigationStyle": "custom",
"mp-alipay": {
"transparentTitle": "always",
"titlePenetrate": "YES"
}
},
3.3、easycom 组件快捷配置
传统vue组件,需要安装、引用、注册,三个步骤后才能使用组件。easycom将其精简为一步。 只要组件安装在项目的components目录下,并符合components/组件名称/组件名称.vue目录结构。就可以不用引用、注册,直接在页面中使用。
"easycom": {
"autoscan": true,
"custom": {
"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue",
}
},
说明:
- easycom方式引入的组件无需在页面内import,也不需要在components内声明,即可在任意页面使用。
- easycom方式引入组件不是全局引入,而是局部引入。例如在H5端只有加载相应页面才会加载使用的组件。
- 在组件名完全一致的情况下,easycom引入的优先级低于手动引入(区分连字符形式与驼峰形式)。
- 考虑到编译速度,直接在pages.json内修改easycom不会触发重新编译,需要改动页面内容触发。
- easycom只处理vue组件,不处理小程序专用组件(如微信的wxml格式组件)。不处理后缀为.nvue的组件。但vue组件也可以全端运行,包括小程序和app-nvue。可以参考uni ui,使用vue后缀,同时兼容nvue页面。
- nvue页面里引用.vue后缀的组件,会按照nvue方式使用原生渲染,其中不支持的css会被忽略掉。这种情况同样支持easycom
3.4、tabBar 底部标签栏
参见:https://uniapp.dcloud.io/collocation/pages?id=tabbar 官方代码示例:
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/component/index",
"iconPath": "static/image/icon_component.png",
"selectedIconPath": "static/image/icon_component_HL.png",
"text": "组件"
}, {
"pagePath": "pages/API/index",
"iconPath": "static/image/icon_API.png",
"selectedIconPath": "static/image/icon_API_HL.png",
"text": "接口"
}]
}
注意:页面路径,必须在 pages 中先定义。
3.5、subPackages 分包加载配置
分包加载配置,此配置为小程序的分包加载机制。 具体内容查阅:【https://uniapp.dcloud.io/collocation/pages?id=subpackages】。
代码格式:
"subPackages": [{
"root": "pages/mine",
"pages": [{
"path": "setting",
"style": {
"navigationStyle": "custom"
}
},
{
"path": "card",
"style": {
"navigationStyle": "custom"
}
}
]
}],
3.6、preloadRule 分包预载配置
分包预载配置。 参见:https://uniapp.dcloud.io/collocation/pages?id=preloadrule
示例:
"preloadRule": {
"pagesA/list/list": {
"network": "all",
"packages": ["__APP__"]
},
"pagesB/detail/detail": {
"network": "wifi",
"packages": ["pagesA"]
}
}
3.7、condition 启动模式配置
启动模式配置,仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。
参见:https://uniapp.dcloud.io/collocation/pages?id=condition 官方代码示例:
"condition": {
"current": 0,
"list": [{
"name": "swiper",
"path": "pages/component/swiper/swiper",
"query": "interval=4000&autoplay=false"
},
{
"name": "test",
"path": "pages/component/switch/switch"
}
]
}
这是一个很赞的调试配置。
4、manifest.json 应用配置
应用的配置文件,用于指定应用的名称、图标、权限等。HBuilderX 创建的工程此文件在根目录,CLI 创建的工程此文件在 src 目录。微信小程序配置具体查看mp-weixin。
微信小程序面版配置示例: 源码视图(位置见上图),微信小程序配置示例:
{
"name": "xxxxx-miniprogram",
"appid": "__UNI__xxxxx",
"description": "",
"versionName": "1.0.0",
"versionCode": "1",
"transformPx": false,
"mp-weixin": {
"appid": "wx_xxxxx_95809",
"setting": {
"urlCheck": true,
"es6": true,
"postcss": true,
"minified": true
},
"usingComponents": true,
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
}
},
"quickapp": {},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"vueVersion": "2",
"uniStatistics": {
"enable": false
}
}
5、uni.scss文件 全局样式控制
参见:https://uniapp.dcloud.io/collocation/uni-scss 为了方便整体控制应用的风格。比如按钮颜色、边框风格,uni.scss文件里预置了一批scss变量预置。 uni.scss是一个特殊文件,在代码中无需 import 这个文件即可在scss代码中使用这里的样式变量。uni-app的编译器在webpack配置中特殊处理了这个uni.scss,使得每个scss文件都被注入这个uni.scss,达到全局可用的效果。
注意: 1、如要使用这些常用变量,需要在 HBuilderX 里面安装 scss 插件; 2、使用时需要在 style 节点上加上【lang=“scss”】。
<style lang="scss">
</style>
3、pages.json不支持scss,原生导航栏和tabbar的动态修改只能使用js api
思考: 1、要不要添加小程序全局样式配置? 2、小程序全局样式配置的颗粒度要到什么程度? 3、能否做好、怎么做好与UI的沟通,提前处理UI整体样式的规范? 4、能否站在小程序整体的高度去思考,协调产品、UI尽量统一一些细微差异样式,使全局样式配置得到更多的应用? 待以上几个问题思考清楚了,那么就可以决定要怎么做了。如果连上面几个问题都不去考虑的,那么设计全局配置就没有什么意义了。
拓展: DCloud社区问答:App.vue和 uni.scss都可以统一页面的样式,那么他们的区别是什么? 本质上分析:
- uni.scss:仅用于添加统一样式的配置。
- App.vue:样式添加只是其中的一项功能。最主要的是应用生命周期的监听和数据处理(options里面的数据和全局数据)。
- App.vue实现需要另外注意的是:如果工程下同时有vue和nvue文件,全局样式的所有css会应用于所有文件,而nvue支持的css有限,编译器会在控制台报警,提示某些css无法在nvue中支持。此时需要把nvue不支持的css写在单独的条件编译里。
结论:统一样式最好还是放在 uni.scss 文件中。
6、配置环境变量
项目的不同创建方式,环境配置方式有所不同,参照如下:
1、vue-config.js 在 vue.config.js 中可以修改 webpack 配置,包括环境变量,具体参考 vue-config.js。 2、package.json 在自定义条件编译平台时,可以在 package.json 文件的 env 节点下配置环境变量,具体参考 package.json .env 3、CLI 创建的项目中可以在根目录中放置 .env 文件来指定环境变量,具体参考:环境变量。
7、package.json 自定义条件编译平台
1、在开发web时,有时需要一套代码编译发布到不同的站点,比如主站和微信h5站。(注意不是一套代码内部自适应不同浏览器,是真的分离部署了。 2、在开发小程序时,经常有扩展小程序平台,比如基于阿里小程序的钉钉小程序、淘宝小程序。
扩展新的平台后,有3点影响:
- 1、新增了对应平台的条件编译,可以为新平台编写专用代码。
- 2、运行时面向新平台编译运行。
- 3、发行时面向新平台编译发行。
注意: 1、只能扩展web和小程序平台,不能扩展app打包。 2、扩展小程序平台时只能基于指定的基准平台扩展子平台,不能扩展基准平台。
官方格式示例:
{
"uni-app": {
"scripts": {
"mp-dingtalk": {
"title": "钉钉小程序",
"env": {
"UNI_PLATFORM": "mp-alipay"
},
"define": {
"MP-DINGTALK": true
}
},
"h5-weixin": {
"title":"微信服务号",
"BROWSER":"Chrome",
"env": {
"UNI_PLATFORM": "h5"
},
"define": {
"H5-WEIXIN": true
}
}
}
}
}
对应新增条件编译:
小程序平台通用代码(含钉钉)
支付宝平台通用代码(含钉钉)
钉钉平台特有代码
H5平台通用代码(含微信服务号)
微信服务号特有代码
Tips: 1、package.json文件中不允许出现注释,否则扩展配置无效。(目前亲测有效,应该是优化了) 2、vue-cli需更新到最新版,HBuilderX需升级到 2.1.6+ 版本。
结果展示:
8、vue.config.js 编译自动加载
1、是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载。 2、一般用于配置 webpack 等编译选项,具体规范参考:vue.config.js 3、这里是用HBuilderX创建的项目,没有 webpack 编译选项,有兴趣的可以到官方文档了解。 4、尝试了下,目前简单处理的方法有:发布时删除console,感觉挺鸡肋的。真正的实用性能有待挖掘!!!
参考: uni-app配置
|