午夜91福利视频,午夜成人在线观看,午夜在线视频免费观看,午夜福利短视频,精品午夜成人免费视频APP

小程序模板網

小程序多業務線融合【完整分包業務接入】

發布(bu)時(shi)間:2018-09-11 15:53 所屬欄目:小程序開發教程

應用場景

  • 同一個主體(公司、部門)下有多個小程序
  • 這些小程序,由一個主小程序和后來新建的多條業務線構成(每條業務線擁有獨立的小程序)
  • 各業務線的小程序需要掛載到主程序下面,因為需要主程序導流
  • 同時各業務線自己的小程序也照常發布更新
  • ==一套代碼,通過打包命令,來生成獨立包和分包==(分包生成完需要拷貝到主程序的subPages目錄下)

項目概述

我的這(zhe)條業務線叫(jiao)歡(huan)樂送(項目名為enjoy_given),是轉(zhuan)(zhuan)轉(zhuan)(zhuan)旗下一個免費的以物(wu)換物(wu)平臺

因為(wei)我們這條(tiao)業務線小程序是(shi)用mpvue構建的(整個項(xiang)目(mu)也是(shi)通過mpvue的cli生成的),所以后面相關配置都是(shi)以mpvue為(wei)例,如果是(shi)wepy項(xiang)目(mu)基本也大同小異。

下面(mian)就(jiu)是我們的目錄結構

src目錄下(xia)的幾個js文件需要專(zhuan)門(men)介(jie)紹下(xia):

src/App.vue 是小(xiao)程序(xu)的(de)入口文件,里面定義的(de)是小(xiao)程序(xu)的(de)生命周(zhou)期

src/main.js 里面初始化通用業務(wu)、定義小程(cheng)序頁面路徑和全局變量

src/vars.js 存放整個(ge)項(xiang)目的全局變量

 src/baseInstall.js 基礎方法裝配邏(luo)輯(如:給vue對象掛載登錄(lu)、統計(ji)邏(luo)輯、識別渠道號(hao)等(deng))

分包配置概述

  • 首先(xian)要配置source和appid

     作為分包時,這兩個(ge)參數都(dou)要統一(yi)采(cai)用主包參數(建議通過webpack配置(zhi)來實現)

    source:是每條(tiao)業(ye)務線(xian)登錄、注(zhu)冊、和接口訪問時用(yong)的標識,用(yong)來(lai)區分該用(yong)戶(hu)來(lai)自于哪(na)條(tiao)業(ye)務線(xian)

    appid:微信(xin)分配的小程序(xu)appid

    為(wei)什么要配置這兩參數:因為(wei)不配置沒法登錄

  • 頁(ye)面路(lu)徑問(wen)題

    作(zuo)為分包(bao)時,所有頁面的跳轉(zhuan)路徑都要加主包(bao)的跳轉(zhuan)前綴(建議通過包(bao)裝(zhuang)跳轉(zhuan)方法navigateTo、redirectTo、reLaunch、navigateBack實現,建議配合webpack統一處理(li))

    當新業(ye)務(wu)線作為(wei)分包接入主(zhu)程序時(shi),頁面跳轉路(lu)徑前需要(yao)統一(yi)(yi)加一(yi)(yi)個前綴

    如:獨(du)立(li)小程(cheng)序首頁路徑(jing)為(wei) /pages/content/index/main

    作(zuo)為(wei)分包時,主程序分配的包為(wei)/subPages/enjoy_given

    那么分包業務線首(shou)頁(ye)路(lu)徑為(wei): /subPages/enjoy_given/pages/content/index/main

  • wxss引用路(lu)徑問(wen)題

    不要(yao)用使根目錄引(yin)入方式(建議采用webpack或者shell腳本(ben)來完成)

    因為在分包(bao)狀(zhuang)態下,用根(gen)目錄(lu)訪問(wen)方式會(hui)直接訪問(wen)主程序的根(gen)目錄(lu),文件是(shi)不存(cun)在的

  • 圖片路徑(jing)問題

     所有圖(tu)片路徑統一采用cdn資源訪(fang)問方式,不要引用本地圖(tu)片

  • 對于分包的main.js和App.vue入口(kou)文件不執行的問題(ti)

    可(ke)以通(tong)過抽離基礎業務(wu)裝(zhuang)配方法,對(dui)于每一個從(cong)主包跳(tiao)到分(fen)包頁(ye)面(mian)的入口分(fen)別引入,后面(mian)會細說

  • 對于小程(cheng)序(xu)內的h5頁(ye)面拉起小程(cheng)序(xu)頁(ye)面

     在打開webview時候,要(yao)(yao)加入一(yi)個標志位,或者(zhe)prefix,告(gao)訴h5頁面,當前(qian)(qian)處于(yu)分包當中,打開的小程序path要(yao)(yao)加前(qian)(qian)綴

  •  分享路(lu)徑(jing)問(wen)題,在路(lu)徑(jing)前面也要加入路(lu)徑(jing)前綴

    可以通過一個(ge)通用的分享方法,進(jin)行統一處理,后面(mian)會細(xi)說

  • 小程序的所有頁面(mian)都(dou)需要(yao)在主包入(ru)口文件(app.vue)注(zhu)冊,每新增頁面(mian)都(dou)要(yao)注(zhu)冊

    這(zhe)個是坑,尤其(qi)新增頁(ye)面時,會(hui)很容易忽略這(zhe)個問題,這(zhe)里要特別強調下

分包接入需要注意的地方
  • storage命(ming)名問題,為了避免(mian)和(he)主程(cheng)序或者其他業(ye)務(wu)線小(xiao)程(cheng)序發生沖突(建(jian)議(yi)采(cai)用 zz_業(ye)務(wu)名_xxx, 我們業(ye)務(wu)名是enjoy_given,簡稱eg,如: zz_eg_address, zz指的就是轉(zhuan)轉(zhuan))

  • 登錄問(wen)題,推薦和主(zhu)程序使用同樣(yang)的cookie名稱,這樣(yang)可以通用一(yi)套(tao)用戶(hu)信息(xi),免得雙方(fang)各維護一(yi)套(tao),還(huan)能避免重復授權。

  • 支(zhi)付(fu)問題,保證下單時(shi)和支(zhi)付(fu)時(shi),cookie中的參數(shu)保持一(yi)致(zhi)

  • 調試,可(ke)以找主程序那邊要(yao)個主程序的(de)測試包,把(ba)生成(cheng)的(de)代碼(ma)(dist目錄下的(de)內容)拷貝(bei)到主程序包的(de) subPages/業務名/ 下面

     例如我們的目錄(lu)是 subPages/enjoy_given/(目錄(lu)結構同上)

一套代碼,通過不同打包命令生成對應的程序包(獨立包和分包)

package.json中scripts


"scripts": {
    "dev": "node build/dev-server.js",
    "start": "node build/dev-server.js",
    "build": "rimraf dist && node build/build.js",
    "lint": "eslint --ext .js,.vue src",
    "build_subPkg": "node build/build-subpkg.js && sh ./scripts/path-replace.sh"
}

獨立小程序(調試) npm run dev
獨立小程序(構建) npm run build
主程序分包(構建) npm run build_subPkg
為什么沒有主程序分包(測試)

因為我們無論是構建測試分包(bao)還是構建正(zheng)式分包(bao),都要把(ba)生(sheng)成dist下(xia)的(de)代(dai)碼拷(kao)貝到主程序的(de)subPages/enjoy_given/目錄下(xia),成本(ben)基(ji)本(ben)是一(yi)樣的(de),所以,就沒有寫構件(jian)分包(bao)的(de)命令

分包webpack配置

 因為需要(yao)兼(jian)容獨立小程(cheng)序和分包業務,webpack我們建議分開(kai)配(pei)置

我們對測試環境和正式環境分別配置了webpack,通過對webpack配置替換全局變量,直接修改項目的全局參數。
通過npm命(ming)令動態(tai)執行(xing)替(ti)換。

為(wei)了(le)分(fen)開配置,我們(men)拷貝了(le)一份(fen)build.js更名為(wei)build-subpkg.js


"scripts": {
    ...,
    "build_subPkg": "node build/build-subpkg.js && sh ./scripts/path-replace.sh"
}

build_subPkg命令就是讀取的build-subpkg.js文件
build.js和build-subpkg.js中99%的內(nei)容都(dou)一(yi)樣,只有一(yi)行不(bu)一(yi)樣


var webpackConfig = require('./webpack.prod.conf')
變更為
var webpackConfig = require('./webpack.subpkg.prod.conf')

所以下一步就是創建webpack.subpkg.prod.conf文件
webpack.subpkg.prod.conf由webpack.prod.conf拷貝而來,里(li)面(mian)依舊99%的內容(rong)一致(zhi)

// webpack.prod.conf


...
var config = require('../config')
var env = config.build.env
...
var webpackConfig = merge(baseWebpackConfig, {
    ...
    plugins: [
        new webpack.DefinePlugin({
            'process.env': env,
            'app.source': env.APP_SOURCE,
            'app.udeskDebug': env.UDESK_DEBUG,
            'app.id': env.APP_ID,
            'app.pathPrefix': env.APP_PATH_RREFIX,
            'app.isUseCrazyFormId': env.IS_USE_CRAZY_FORMD_ID
        }),
        ...
    ]
})

// webpack.subpkg.prod.conf


...
var config = require('../config')
var env = config.build.env
...
var webpackConfig = merge(baseWebpackConfig, {
    ...
    plugins: [
        new webpack.DefinePlugin({
            'process.env': env,
            'app.source': env.APP_SUB_PKG_SOURCE,
            'app.udeskDebug': env.UDESK_DEBUG,
            'app.id': env.APP_SUB_PKG_ID,
            'app.pathPrefix': env.APP_SUB_PKG_PATH_RREFIX,
            'app.isUseCrazyFormId': env.IS_USE_CRAZY_FORMD_ID
        }),
        ...
    ]
})

DefinePlugin插件是用來進行全局替換的
如:’process.env’: ‘“hahaha”‘, 指(zhi)的(de)就是全局process.env替(ti)換為”hahaha”

里面通過定義多個全局變量,實現打包時,通過不同的命令替換對應環境下的全局變量
我們看一下../config/index.js中的文(wen)件


var path = require('path')

module.exports = {
  build: {
    env: require('./prod.env'),
    ...
  },
  dev: {
    env: require('./dev.env'),
    ...
  }
}

引(yin)入了dev.env.js和prod.env.js

以prod.env.js為例


module.exports = {
  // 環境
  NODE_ENV: '"production"',
  // 歡樂送獨立小程序source
  APP_SOURCE: '114',
  // 歡樂送分包小程序source
  APP_SUB_PKG_SOURCE: '103',
  // 歡樂送獨立程序appid
  APP_ID: '"wxaaaaaaaaaaaaaaa"',
  // 歡樂送分包程序appid
  APP_SUB_PKG_ID: '"wxbbbbbbbbbbbbbbbb"',
  // udesk測試標志位
  UDESK_DEBUG: false,
  // 歡樂送獨立小程序頁面路徑前綴
  APP_PATH_RREFIX: '""',
  // 歡樂送分包小程序頁面路徑前綴
  APP_SUB_PKG_PATH_RREFIX: '"/subPages/enjoy_given"',
  // 是否啟用crazyFormId
  IS_USE_CRAZY_FORMD_ID: true
}

然后我們再來看一下(xia)存放全局變量的(de)文件src/vars.js(上面項目(mu)截(jie)圖(tu)中有)


// 小程序常量
export default {
  ...
  // 小程序版本號
  version: '1.3.5',
  // 小程序appid
  appId: app.id,
  // 小程序source(由webpack根據不同環境統一替換)
  source: app.source,
  // 路徑前綴
  pathPrefix: app.pathPrefix,
  // 是否啟用CrazyFormId
  isUseCrazyFormId: app.isUseCrazyFormId
}

var webpackConfig = merge(baseWebpackConfig, {
    ...
    plugins: [
        new webpack.DefinePlugin({
            'process.env': env,
            'app.source': env.APP_SUB_PKG_SOURCE,
            'app.udeskDebug': env.UDESK_DEBUG,
            'app.id': env.APP_SUB_PKG_ID,
            'app.pathPrefix': env.APP_SUB_PKG_PATH_RREFIX,
            'app.isUseCrazyFormId': env.IS_USE_CRAZY_FORMD_ID
        }),
        ...
    ]
})

在打包完成后(hou),全局變(bian)量文件中(zhong)的(de)”app.xxx”會(hui)被(bei)webpack中(zhong)的(de)同名變(bian)量替換掉(diao)

如vars.js中 appId: app.id的app.id會(hui)被(bei)替換,獨(du)立小程序時該值為”wxaaaaaaaaaaaaaaa”,作(zuo)為分包業務時,該值為”wxbbbbbbbbbbbbbb”

這樣整(zheng)個替換(huan)全(quan)局變量的(de)流程就跑完了

==作為分包,接入主程序中,自己的main.js和App.vue都不會執行==

這個是(shi)大坑,因為很多通用業務(wu)的(de)初(chu)始化如登錄(lu)、cookie、統計都是(shi)在這里完(wan)成的(de)。

解決方案

把基礎功能的裝配業務(如在錄、統計、識別渠道號等邏輯)從main.js中抽離到另一個文件,我這里叫baseInstall.js。
里面我還加入了對query的(de)處理,比如渠道號channel和微信入口scene。

那這樣的(de)話(hua),src/main.js就會變(bian)得非常簡單,


import Vue from 'vue'
import App from './App'
import baseInstall from './baseInstall'
App.mpType = 'app'
baseInstall.init()  // !!!最關鍵就是這行代碼!!!
const app = new Vue(App)
app.$mount()

export default {
  config: {
    pages: [
      '^pages/content/index/main',            // 首頁
      ...
    ],
    window: {
      ...
    }
  }
}

里面最關鍵(jian)的(de)是baseInstall.init()這行代碼

下面我們來(lai)看(kan)看(kan)baseInstall.js


// 通用業務裝配初始化
...
async function init (opts) {
  let options = opts
  ...
  // 獲取指定渠道號
  const channel = options.channel || options.c || ''
  // 設置渠道號
  if (channel) {
    VARS.channel = channel.indexOf('waeg_') === 0 ? channel : ('waeg_' + channel)
  }
  ...
  if (!VARS.baseInstallFlag) {
    // 為了避免重復裝備,通過標志位進行區分
    VARS.baseInstallFlag = true
    ...
    // 登錄配置
    ZZLogin.config({
      source: VARS.source
    })
    ZZLogin.install()
    Navigator.install()
    // 統計
    LeStatic.config({
      appid: VARS.source,
      pageTypePrefix (currentRoute) {
        return 'waeg_'
      }
    }).install()
    ...
  }
  // 寫入cookie
  cookie.set({
    channelid: VARS.channel,
    fromShareUid: VARS.shareUid
  })

  return options
}

export default {
  init
}
為什么要用VARS.baseInstallFlag標志位

因為,在分(fen)包時(shi)候是不執行main.js的,實(shi)際場景,會從主包的業務直(zhi)接(jie)跳轉到分(fen)包的一些頁面(mian)。

  由于沒(mei)有固定入口(kou),所以在這些頁面中(zhong)都要加入baseInstall.js的引入,為了避免重復(fu)裝配(pei),才會設置這個標志位。

為什么要把這些業務抽離

  baseInstall.init里面(mian)涵蓋(gai)了(le)所有啟動小程序時需要初始化(hua)的(de)業(ye)務

前面也提到(dao)了在作為(wei)分(fen)包(bao)時,自己的App.vue和main.js是不(bu)會執行的。

那怎么辦,這樣,就在所有的頁面中,在onLoad的生命周期中加入baseInstall.init方法。
,所(suo)以我們抽離肯(ken)定是為了(le)更方便的復(fu)用了(le)。

以首頁為例(li)(pages/content/index/index.vue)


import baseInstall from '@/baseInstall'

export default {
    ...
    async onLoad (options) {
        options = await baseInstall.init(options)
        ...
    }
}

用async/await是因為(wei)baseInstall.init中部分邏輯(ji)用到了異步請(qing)求

因為主程序不會讀取main.js,所以,所有的分包頁面路徑,都要統一在主程序中注冊

注(zhu):每(mei)新增一(yi)個(ge)頁面,都要(yao)在(zai)主程序中(zhong)注(zhu)冊(ce)。也就是新增一(yi)個(ge)頁面,就要(yao)通知主程序那邊,在(zai)他們的文件里統一(yi)注(zhu)冊(ce)

頁面路徑

在分包中,所有(you)頁面路徑(jing)訪(fang)問要加入(ru)前綴

如(ru):原來(lai)訪問/pages/content/index/main就可以(yi)了

但是(shi)分包的訪問路徑為:/subPages/enjoy_given/pages/content/index/main

解決方案:

以(yi)包裝的navigateTo為(wei)例


async navigateTo (route) {
    route.url = VARS.pathPrefix + (route.url.indexOf('/') === 0 ? '' : '/') + route.url // 這里做前綴處理
    console.log('[Navigator] navigateTo:', route)
    ...
    wx.navigateTo(route)
}

這里面需不需要加前綴,都是由全局(ju)變量(liang)VARS中的pathPrefix來決定(ding)

而pathPrefix是在打包過程中由(you)webpack根據打包命令動態(tai)替換的

圖片訪問路徑問題

圖片訪(fang)(fang)問(wen)路徑(jing)統一采用cdn的(de)(de)資源訪(fang)(fang)問(wen)路徑(jing),不(bu)要用本地訪(fang)(fang)問(wen)路徑(jing),要不(bu)然在分包路徑(jing)中是有(you)問(wen)題的(de)(de),同(tong)時也(ye)會增加程(cheng)序包的(de)(de)體(ti)積

wxss路徑問題

用mpvue生(sheng)成的wxss文件,里面會把通用的vendor.wxss引入,但(dan)是引入路(lu)徑(jing)是根路(lu)徑(jing),作為分包,直接引入根路(lu)徑(jing),會去訪問主(zhu)包的路(lu)徑(jing),導致文件無法找到。


@import "/static/css/vendor.wxss"; //在分包中用根路徑是無法找到文件的
._button,._input[type=button],._input[type=reset],._input[type=submit],._textarea{-webkit-appearance:none}._button:after{border:none}page{background-color:#fff}...
解決方案

通過shell腳本對文件進行批量替換
scripts/path-replace.sh


#!/bin/sh
sed -i "_bak" "s/\/static\/css\/vendor\.wxss/\/subPages\/enjoy_given\/static\/css\/vendor\.wxss/g" `grep "\/static\/css\/vendor\.wxss" -rl ./dist/static/css/pages/**/*.wxss ./dist/static/css/pages/*/*/*.wxss`

這段shell腳本的(de)(de)目的(de)(de)就(jiu)是把./dist/static/css/pages/下所有的(de)(de)wxss文(wen)件中的(de)(de)/static/css/vendor.wxss替(ti)換成/subPages/huanlesong/static/css\vendor.wxss

替換完成后,路徑變更ok
生成正式(shi)包(bao)的(de)時候,用(yong)npm run build_subPkg就ok了

分享路徑問題

主程序(xu)和獨立小程序(xu)分享出來的路(lu)徑(jing)也是一(yi)樣的,處(chu)理方式和跳轉類似。

解決方案

建議(yi)通過通用(yong)方(fang)法統一處(chu)理,我們的(de)做法是(shi),在(zai)頁(ye)面(mian)的(de)onShareAppMessage中加入通用(yong)方(fang)法Share.getFinalShareInfo

以首頁(ye)分享為(wei)例


import Share from '@/lib/share'
export default {
    ...
    onShareAppMessage () {
        ...
        return Share.getFinalShareInfo({
            title: 'xxx',
            path: `/pages/content/index/main`,
            imageUrl: 'xxxx'
        })
    }
}

分(fen)享時統(tong)一調用Share.getFinalShareInfo方法

我們再(zai)來(lai)看下share.js


export default class Share {
    static getFinalShareInfo (shareInfo) {
        ...
        // 路徑前綴處理
        shareInfo.path = VARS.pathPrefix + (shareInfo.path.indexOf('/') === 0 ? '' : '/') + shareInfo.path
        ...
        return shareInfo
    }
}

這樣整個(ge)分包業務就配置完成了。是不是很(hen)麻煩~

當初和主程序融(rong)合時(shi)候(hou)確實踩(cai)了很(hen)多坑,這里我把解決方案(an)和大(da)家分(fen)享下

如果有(you)更好的解決(jue)方(fang)案,也(ye)希望一起(qi)交流:)



易優小(xiao)程序(企業(ye)版)+靈(ling)活(huo)api+前后代碼(ma)開源 碼云倉庫:
本文地址://www.jinyoudianli.com/wxmini/doc/course/24798.html 復制鏈接 如(ru)需定制請聯系(xi)易優客(ke)服咨(zi)詢(xun):

工作日 8:30-12:00 14:30-18:00
周(zhou)六(liu)及部(bu)分節假日(ri)提供(gong)值班服務(wu)

易小優(you)
轉(zhuan)人工 ×