├── static
└── .gitkeep
├── unpackage
├── .dependencies
├── res
│ └── icons
│ │ ├── 20x20.png
│ │ ├── 29x29.png
│ │ ├── 40x40.png
│ │ ├── 48x48.png
│ │ ├── 58x58.png
│ │ ├── 60x60.png
│ │ ├── 72x72.png
│ │ ├── 76x76.png
│ │ ├── 80x80.png
│ │ ├── 87x87.png
│ │ ├── 96x96.png
│ │ ├── 120x120.png
│ │ ├── 144x144.png
│ │ ├── 152x152.png
│ │ ├── 167x167.png
│ │ ├── 180x180.png
│ │ ├── 192x192.png
│ │ ├── 256x256.png
│ │ └── 1024x1024.png
└── .confirmed_dependencies
├── src
├── utils
│ ├── README.md
│ ├── plus
│ │ ├── runtime.js
│ │ └── nativeUI.js
│ ├── request.js
│ ├── envent.js
│ ├── tools.js
│ ├── common.js
│ └── webview.js
├── assets
│ ├── logo.png
│ └── mui
│ │ └── mui.ttf
├── page
│ ├── goods
│ │ ├── cart.js
│ │ ├── detail.js
│ │ ├── cart.vue
│ │ └── detail.vue
│ ├── mui
│ │ ├── index.js
│ │ └── index.vue
│ ├── vux
│ │ ├── index.js
│ │ └── index.vue
│ └── user
│ │ ├── index.js
│ │ └── index.vue
├── page.json
├── components
│ ├── content.vue
│ ├── logo.vue
│ └── HelloWorld.vue
├── main.js
└── App.vue
├── test
└── unit
│ ├── setup.js
│ ├── .eslintrc
│ ├── specs
│ └── HelloWorld.spec.js
│ └── jest.conf.js
├── .eslintignore
├── config
├── prod.env.js
├── test.env.js
├── dev.env.js
└── index.js
├── docs
├── guide
│ ├── practice
│ │ ├── details.md
│ │ └── webview.md
│ ├── production.md
│ ├── about.md
│ ├── qa.md
│ ├── introduction.md
│ ├── update_log.md
│ ├── development.md
│ └── guide.md
├── .vuepress
│ ├── public
│ │ ├── h1.png
│ │ ├── h2.png
│ │ ├── h3.png
│ │ ├── s0.png
│ │ ├── s1.png
│ │ ├── s2.png
│ │ ├── s3.png
│ │ ├── logo.png
│ │ ├── wxpay.JPG
│ │ ├── IMG_0040.PNG
│ │ ├── alipay.JPG
│ │ ├── hotfix
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ └── 5.png
│ │ ├── S80805-211149.jpg
│ │ └── S80806-112100.jpg
│ ├── override.styl
│ └── config.js
├── README.md
├── deploy.sh
└── hotfix
│ ├── old
│ ├── usage.md
│ ├── hotfitxFemirror.md
│ ├── introduction.md
│ └── hotfix.md
│ ├── hotfitxFemirror.md
│ ├── introduction.md
│ └── config.md
├── .editorconfig
├── .postcssrc.js
├── .gitignore
├── index.html
├── .babelrc
├── .eslintrc.js
├── .project
├── package.json
├── README.md
└── manifest.json
/static/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/unpackage/.dependencies:
--------------------------------------------------------------------------------
1 | null
--------------------------------------------------------------------------------
/src/utils/README.md:
--------------------------------------------------------------------------------
1 | # 建议
2 |
3 | 我们建议您将自己的常用函数库放在其他的文件夹.
4 |
5 | 因为我们会时而更新此文件夹中的函数
6 |
--------------------------------------------------------------------------------
/test/unit/setup.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 |
3 | Vue.config.productionTip = false
4 |
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/src/assets/logo.png
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 | /test/unit/coverage/
6 | /src/
7 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/src/assets/mui/mui.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/src/assets/mui/mui.ttf
--------------------------------------------------------------------------------
/docs/guide/practice/details.md:
--------------------------------------------------------------------------------
1 | # 实现细节
2 |
3 | ## 多页面的实现
4 |
5 | ## nodemon 的使用
6 |
7 | ## mui 的加载
8 |
--------------------------------------------------------------------------------
/test/unit/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "jest": true
4 | },
5 | "globals": {
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/docs/.vuepress/public/h1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/h1.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/h2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/h2.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/h3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/h3.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/s0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/s0.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/s1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/s1.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/s2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/s2.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/s3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/s3.png
--------------------------------------------------------------------------------
/unpackage/res/icons/20x20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/20x20.png
--------------------------------------------------------------------------------
/unpackage/res/icons/29x29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/29x29.png
--------------------------------------------------------------------------------
/unpackage/res/icons/40x40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/40x40.png
--------------------------------------------------------------------------------
/unpackage/res/icons/48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/48x48.png
--------------------------------------------------------------------------------
/unpackage/res/icons/58x58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/58x58.png
--------------------------------------------------------------------------------
/unpackage/res/icons/60x60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/60x60.png
--------------------------------------------------------------------------------
/unpackage/res/icons/72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/72x72.png
--------------------------------------------------------------------------------
/unpackage/res/icons/76x76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/76x76.png
--------------------------------------------------------------------------------
/unpackage/res/icons/80x80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/80x80.png
--------------------------------------------------------------------------------
/unpackage/res/icons/87x87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/87x87.png
--------------------------------------------------------------------------------
/unpackage/res/icons/96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/96x96.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/logo.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/wxpay.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/wxpay.JPG
--------------------------------------------------------------------------------
/unpackage/res/icons/120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/120x120.png
--------------------------------------------------------------------------------
/unpackage/res/icons/144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/144x144.png
--------------------------------------------------------------------------------
/unpackage/res/icons/152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/152x152.png
--------------------------------------------------------------------------------
/unpackage/res/icons/167x167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/167x167.png
--------------------------------------------------------------------------------
/unpackage/res/icons/180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/180x180.png
--------------------------------------------------------------------------------
/unpackage/res/icons/192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/192x192.png
--------------------------------------------------------------------------------
/unpackage/res/icons/256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/256x256.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/IMG_0040.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/IMG_0040.PNG
--------------------------------------------------------------------------------
/docs/.vuepress/public/alipay.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/alipay.JPG
--------------------------------------------------------------------------------
/docs/.vuepress/public/hotfix/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/hotfix/1.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/hotfix/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/hotfix/2.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/hotfix/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/hotfix/3.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/hotfix/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/hotfix/4.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/hotfix/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/hotfix/5.png
--------------------------------------------------------------------------------
/unpackage/res/icons/1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/unpackage/res/icons/1024x1024.png
--------------------------------------------------------------------------------
/docs/.vuepress/override.styl:
--------------------------------------------------------------------------------
1 | $accentColor = #F7782E
2 | $textColor = #2c3e50
3 | $borderColor = #eaecef
4 | $codeBgColor = #282c34
--------------------------------------------------------------------------------
/docs/.vuepress/public/S80805-211149.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/S80805-211149.jpg
--------------------------------------------------------------------------------
/docs/.vuepress/public/S80806-112100.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tyaqing/mogo-h5plus/HEAD/docs/.vuepress/public/S80806-112100.jpg
--------------------------------------------------------------------------------
/docs/guide/practice/webview.md:
--------------------------------------------------------------------------------
1 | # Webview
2 |
3 | ## openWebview()
4 |
5 | ## openWebviewFast()
6 |
7 | ## preLoad()
8 |
9 | ## showWebviewById()
10 |
--------------------------------------------------------------------------------
/src/page/goods/cart.js:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 | import "@/utils/common";
3 | import App from "./cart.vue";
4 |
5 | new Vue({
6 | el: "#app",
7 | render: h => h(App)
8 | });
9 |
--------------------------------------------------------------------------------
/src/page/mui/index.js:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 | import "@/utils/common";
3 | import App from "./index.vue";
4 |
5 | new Vue({
6 | el: "#app",
7 | render: h => h(App)
8 | });
9 |
--------------------------------------------------------------------------------
/src/page/vux/index.js:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 | import "@/utils/common";
3 | import App from "./index.vue";
4 |
5 | new Vue({
6 | el: "#app",
7 | render: h => h(App)
8 | });
9 |
--------------------------------------------------------------------------------
/src/page/goods/detail.js:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 | import "@/utils/common";
3 | import App from "./detail.vue";
4 |
5 | new Vue({
6 | el: "#app",
7 | render: h => h(App)
8 | });
9 |
--------------------------------------------------------------------------------
/src/page/user/index.js:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 | import "@/utils/common";
3 | import App from "./index.vue";
4 |
5 | new Vue({
6 | el: "#root",
7 | render: h => h(App)
8 | });
9 |
--------------------------------------------------------------------------------
/config/test.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const devEnv = require('./dev.env')
4 |
5 | module.exports = merge(devEnv, {
6 | NODE_ENV: '"testing"'
7 | })
8 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/src/utils/plus/runtime.js:
--------------------------------------------------------------------------------
1 | export function getProperty() {
2 | return new Promise(resolve => {
3 | plus.runtime.getProperty(plus.runtime.appid, function(inf) {
4 | resolve(inf);
5 | });
6 | });
7 | }
8 |
--------------------------------------------------------------------------------
/src/utils/plus/nativeUI.js:
--------------------------------------------------------------------------------
1 | //http://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.confirm
2 | export function confirm(message, title = "确认") {
3 | return new Promise(resolve => {
4 | plus.nativeUI.confirm(message, resolve, title);
5 | });
6 | }
7 |
--------------------------------------------------------------------------------
/src/utils/request.js:
--------------------------------------------------------------------------------
1 | /**
2 | * http请求模块
3 | */
4 | import axios from 'axios'
5 |
6 | export async function request (data) {
7 | const conf = {
8 | headers: {
9 | // Authorization: "token"
10 | },
11 | ...data
12 | }
13 | return await axios(conf)
14 | }
15 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/docs/guide/production.md:
--------------------------------------------------------------------------------
1 | # 发布
2 |
3 | ## 打包
4 |
5 | ```bash
6 | npm run build
7 | ```
8 |
9 | 运行命令后会有一个`dist`目录,里面的经过压缩的静态文件.
10 |
11 | ### Hbuilder 发行打包
12 |
13 | 在使用 Hbuilder 制作安装包前,请将`入口文件`修改成`dist/index.html`.
14 | 然后可以安心的打包了.
15 |
16 | ## 热更新包
17 |
18 | 在 Hbuilder 菜单栏中选择`发布`->`制作移动APP资源升级包`,得到的`wgt`文件是可以用来更新的
19 |
--------------------------------------------------------------------------------
/src/page.json:
--------------------------------------------------------------------------------
1 | {
2 | "index|plusReady": "./src/main.js",
3 | "goods.detail": "./src/page/goods/detail.js",
4 | "goods.cart|plusReady": "./src/page/goods/cart.js",
5 | "mui.index|mui|plusReady": "./src/page/mui/index.js",
6 | "user.index": "./src/page/user/index.js",
7 | "vux.index|plusReady": "./src/page/vux/index.js"
8 | }
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | /test/unit/coverage/
8 |
9 | # Editor directories and files
10 | .idea
11 | .vscode
12 | *.suo
13 | *.ntvs*
14 | *.njsproj
15 | *.sln
16 |
17 | #Hbuilder
18 | unpackage/debug/
19 | unpackage/release/
20 |
21 | /docs/.vuepress/dist
22 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | home: true
3 | heroImage: /logo.png
4 | actionText: 查看文档 →
5 | actionLink: /guide/introduction.md
6 | features:
7 | - title: Vue多页面
8 | details: 使用vue+webpack+babel构建的多页面脚手架,开发,调试非常便捷.
9 | - title: 热更新
10 | details: 几部简单的操作就可以更新自己的APP,无需繁琐的审核
11 | - title: 云应用
12 | details: 你可以将此想象成[微信-小程序]的关系,快速迭代您的app
13 | footer: MIT Licensed | Copyright © 2018
14 | ---
15 |
--------------------------------------------------------------------------------
/src/components/content.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
17 |
18 |
23 |
--------------------------------------------------------------------------------
/test/unit/specs/HelloWorld.spec.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import HelloWorld from '@/components/HelloWorld'
3 |
4 | describe('HelloWorld.vue', () => {
5 | it('should render correct contents', () => {
6 | const Constructor = Vue.extend(HelloWorld)
7 | const vm = new Constructor().$mount()
8 | expect(vm.$el.querySelector('.hello h1').textContent)
9 | .toEqual('Welcome to Your Vue.js App')
10 | })
11 | })
12 |
--------------------------------------------------------------------------------
/src/utils/envent.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 发送自定义事件
3 | * @param {*} webview
4 | * @param {*} eventType
5 | * @param {*} data
6 | */
7 | export const fire = function(webview, eventType, data) {
8 | console.log(data);
9 | webview &&
10 | webview.evalJS(`
11 | document.dispatchEvent(new CustomEvent("${eventType}", {
12 | detail:${JSON.stringify(data)},
13 | bubbles: true,
14 | cancelable: true
15 | }));
16 | `);
17 | };
18 |
--------------------------------------------------------------------------------
/src/utils/tools.js:
--------------------------------------------------------------------------------
1 | export function isAndroid() {
2 | const ua = navigator.userAgent;
3 | return ua.match(/(Android);?[\s\/]+([\d.]+)?/);
4 | }
5 |
6 | export function isIos() {
7 | const ua = navigator.userAgent;
8 | return ua.match(/(iPhone\sOS)\s([\d_]+)/);
9 | }
10 |
11 | // var iphone = ua.match(/(iPhone\sOS)\s([\d_]+)/);
12 | // var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
13 | // var wechat = ua.match(/(MicroMessenger)\/([\d\.]+)/i);
14 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | <%= htmlWebpackPlugin.options.plusReady %>
8 |
9 | <%= htmlWebpackPlugin.options.muiCssString %>
10 | Mogo H5plus
11 |
12 |
13 |
14 | <%= htmlWebpackPlugin.options.muiScriptString %>
15 |
16 |
17 |
--------------------------------------------------------------------------------
/docs/deploy.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | # 确保脚本抛出遇到的错误
4 | # set -e
5 |
6 | # 生成静态文件
7 | # npm run docs:build
8 |
9 | vuepress build
10 |
11 | # 进入生成的文件夹
12 | cd .vuepress/dist
13 |
14 | # 如果是发布到自定义域名
15 | # echo 'www.example.com' > CNAME
16 |
17 | git init
18 | git add -A
19 | git commit -m 'deploy'
20 |
21 | # 如果发布到 https://.github.io
22 | # git push -f git@github.com:/.github.io.git master
23 |
24 | # 如果发布到 https://.github.io/
25 | git push -f https://github.com/tyaqing/mogo-h5plus.git master:gh-pages
26 |
27 | cd -
--------------------------------------------------------------------------------
/docs/guide/about.md:
--------------------------------------------------------------------------------
1 | # 关于
2 |
3 | ## 框架
4 |
5 | 框架由我个人维护,由于热爱,几乎每周都会有更新,同样关于脚手架周边的服务也在慢慢整合,致力于打造一个优质的 webapp 开发体验.
6 |
7 | ## 赞助
8 |
9 | 您的赞助会使`MogoH5+`发展的更好,所赞助的资金都将提升`FEmirror 云更新`服务.
10 |
11 | | 微信 | 支付宝 |
12 | | ---------------------------------------------------------- | ------------------------------------------------------------- |
13 | |
|
|
14 |
--------------------------------------------------------------------------------
/src/components/logo.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |

5 |
6 |
{{info.version}}
7 |
8 |
9 |
10 |
11 |
32 |
--------------------------------------------------------------------------------
/docs/hotfix/old/usage.md:
--------------------------------------------------------------------------------
1 | # 接入方式
2 |
3 | ## 引入方式
4 |
5 | 可以在`main.js`中添加`checkUpdate(URL);`,打开 app 就会自动检测.还可以放在`检查更新`的按钮上触发.
6 |
7 | ### ES6 Module 引入
8 |
9 | 首先在`page.json`把用到`checkUpdate`的页面加上管道`|plusReady`.
10 |
11 | 然后加载使用.
12 |
13 | ```js
14 | import { checkUpdate } from "./utils/update";
15 | checkUpdate(URL); // 填入您检查api的url地址
16 | ```
17 |
18 | ### ` // 这段必须加载title底下
25 | ....
26 |
27 |
30 | ```
31 |
32 | 如果您没有后端接入,可以使用`FEmirror云更新`
33 |
--------------------------------------------------------------------------------
/test/unit/jest.conf.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 |
3 | module.exports = {
4 | rootDir: path.resolve(__dirname, '../../'),
5 | moduleFileExtensions: [
6 | 'js',
7 | 'json',
8 | 'vue'
9 | ],
10 | moduleNameMapper: {
11 | '^@/(.*)$': '/src/$1'
12 | },
13 | transform: {
14 | '^.+\\.js$': '/node_modules/babel-jest',
15 | '.*\\.(vue)$': '/node_modules/vue-jest'
16 | },
17 | snapshotSerializers: ['/node_modules/jest-serializer-vue'],
18 | setupFiles: ['/test/unit/setup'],
19 | mapCoverage: true,
20 | coverageDirectory: '/test/unit/coverage',
21 | collectCoverageFrom: [
22 | 'src/**/*.{js,vue}',
23 | '!src/main.js',
24 | '!**/node_modules/**'
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "env",
5 | {
6 | "modules": false,
7 | "targets": {
8 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
9 | }
10 | }
11 | ],
12 | "stage-2"
13 | ],
14 | "plugins": [
15 | "transform-vue-jsx",
16 | "transform-runtime",
17 | [
18 | "import",
19 | {
20 | "libraryName": "vant",
21 | "libraryDirectory": "es",
22 | "style": true
23 | }
24 | ]
25 | ],
26 | "env": {
27 | "test": {
28 | "presets": ["env", "stage-2"],
29 | "plugins": [
30 | "transform-vue-jsx",
31 | "transform-es2015-modules-commonjs",
32 | "dynamic-import-node"
33 | ]
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/unpackage/.confirmed_dependencies:
--------------------------------------------------------------------------------
1 | {
2 | "dist/index.html": {
3 | "refer": [
4 | "dist/goods.detail.html",
5 | "dist/mui.index.html",
6 | "dist/vux.index.html",
7 | "dist/goods.cart.html"
8 | ],
9 | "resources": [
10 | "dist/assets/css/vue.css",
11 | "dist/assets/css/index.css",
12 | "dist/assets/img/logo.png"
13 | ]
14 | },
15 | "dist/vux.index.html": {
16 | "resources": [
17 | "dist/assets/css/vux.index.css",
18 | "dist/assets/css/vue.css"
19 | ],
20 | "refer": []
21 | },
22 | "dist/goods.detail.html": {
23 | "resources": [
24 | "dist/assets/css/goods.detail.css"
25 | ],
26 | "refer": []
27 | },
28 | "dist/goods.cart.html": {
29 | "resources": [
30 | "dist/assets/css/goods.cart.css",
31 | "dist/assets/css/vue.css"
32 | ],
33 | "refer": []
34 | }
35 | }
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // https://eslint.org/docs/user-guide/configuring
2 |
3 | module.exports = {
4 | root: true,
5 | parserOptions: {
6 | parser: 'babel-eslint'
7 | },
8 | env: {
9 | browser: true,
10 | },
11 | extends: [
12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
14 | 'plugin:vue/essential',
15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md
16 | 'standard'
17 | ],
18 | // required to lint *.vue files
19 | plugins: [
20 | 'vue'
21 | ],
22 | // add your custom rules here
23 | rules: {
24 | // allow async-await
25 | 'generator-star-spacing': 'off',
26 | // allow debugger during development
27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/docs/hotfix/hotfitxFemirror.md:
--------------------------------------------------------------------------------
1 | # Hotfix 云更新
2 |
3 | Hotfix 云更新的架构设计是`Mysql`+`Redis`+`Egg.js(typescript)`.对内存占用极低,可用性比较高.
4 |
5 | `Hotfix 云更新` 是一个自动化更新平台,无需后端也可以完成 app 日常更新.
6 |
7 | > Hotfix 云更新仅提供测试性功能,不能保障服务的`稳定性`,因此,如果您有商业需求,可以联系作者进行有偿`私有化部署`.
8 |
9 |
10 |
11 | ## [访问网站](https://hotfix.femirror.com/)
12 |
13 | ## 使用指南
14 |
15 | ### 注册
16 |
17 | 使用`Github`授权登录.
18 |
19 | ### 操作步骤
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/docs/.vuepress/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | title: "MogoH5+",
3 | description: "快速开发WebApp的多页面脚手架工具,致力于打造H5+应用生态.",
4 | base: "/mogo-h5plus/",
5 | themeConfig: {
6 | nav: [
7 | { text: "主页", link: "/" },
8 | { text: "MogoH5+", link: "/guide/guide.md" },
9 | { text: "Hotfix", link: "/hotfix/introduction.md" },
10 | { text: "H5+文档", link: "http://www.html5plus.org/doc/h5p.html" }
11 | ],
12 | repo: "tyaqing/mogo-h5plus",
13 | search: true,
14 | sidebar: {
15 | "/guide/": [
16 | {
17 | title: "指南|Guide",
18 | collapsable: false,
19 | children: [
20 | "introduction",
21 | "development",
22 | "production",
23 | "update_log",
24 | "qa"
25 | ]
26 | },
27 | {
28 | title: "最佳实践|Practice",
29 | collapsable: false,
30 | children: ["practice/webview", "practice/details"]
31 | },
32 | {
33 | title: "关于|About",
34 | collapsable: false,
35 | children: ["about"]
36 | }
37 | ],
38 | "/hotfix/": [{
39 | title: "新版本|V1",
40 | collapsable: false,
41 | children: [
42 | "introduction", "config", "hotfitxFemirror"
43 | ]
44 | }, {
45 | title: "旧版本|Old",
46 | collapsable: true,
47 | children: [
48 | "old/introduction", "old/usage", "old/hotfix", "old/hotfitxFemirror"
49 | ]
50 | }]
51 | }
52 | }
53 | };
54 |
--------------------------------------------------------------------------------
/docs/hotfix/old/hotfitxFemirror.md:
--------------------------------------------------------------------------------
1 | # FEmirror 云更新
2 |
3 | `FEmirror 云更新` 是一个自动化更新平台,无需后端也可以完成 app 日常更新.
4 |
5 |
6 |
7 | ## [访问网站](https://hotfix.femirror.com/)
8 |
9 | ## 使用指南
10 |
11 | ### 注册
12 |
13 | 使用`Github`授权登录.
14 |
15 | ### 上传更新包
16 |
17 | 点击左侧`点击/拖动上传升级包`按钮上传升级文件.
18 |
19 | 可以上传`apk`,`wgt`两种类型的文件.
20 |
21 | 文件上传成功后在`应用管理`列表中会出现您刚刚上传的更新包信息.
22 |
23 |
24 |
25 | ### wgt 热更新的发布
26 |
27 | 点击`发布`按钮,如下图,提供几种参数供您选择.
28 |
29 |
30 | #### 更新方式的选择
31 |
32 | 1. 静默更新 : 使用`checkUpdate`方法后检查更新,如果有更新会自动下载 app,整个过程没有任何提示,用户第二次打开 app 就会出现更新后的效果.
33 | 2. 提示更新 : 使用`checkUpdate`方法后检查更新,如果有则会弹出确认框,用户确认后会提示正在下载,正在安装,安装完成重启,更新完成等提示.
34 |
35 | #### 更新平台的选择
36 |
37 | 如果只需要某一个平台更新,可以根据需求选择
38 |
39 | | iphone 效果如下 | 安卓效果如下 |
40 | | ---------------------------------------------------------------- | --------------------------------------------------------------------- |
41 | |
|
|
42 |
43 | ### app 更新的发布
44 |
45 | app 更新只适用于`安卓 apk` 类型,也就是下载更新包后执行安装.
46 |
47 | ### 关闭更新
48 |
49 | 在应用详情的右上角可以关闭更新,关闭更新后用户检查更新后不会作处理
50 |
51 | ## 常见问题
52 |
53 | ### 提示版本不一致
54 |
55 | 在调试热更新的时候必须使用自定义基座,否则得到的版本是 `Hbuilder H5+ App` 的版本.
56 |
57 | ### 更新替换
58 |
59 | 由于这种热更新是替换更新,新的热更新包如果有问题,可能导致 app 无法使用,请测试成功后再发布,或者您上传一个专用于测试的 app
60 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from "vue";
4 | // import hotfix from 'h5plus-hotfix';
5 | import "./utils/common";
6 | import App from "./App";
7 | const appId = "com.femirror.mogoh5";
8 | // const updateUrl = FemirrorAPI + `/public/app/checkUpdate?bundleId=${appId}`;
9 | // hotfix({
10 | // url: updateUrl,
11 | // before(data) {
12 | // // 确认安装
13 | // return new Promise(resolve => {
14 | // plus.nativeUI.confirm(data.description, (selected) => {
15 | // if (selected.index === 0) {
16 | // plus.nativeUI.showWaiting("下载更新文件...");
17 | // resolve(data);
18 | // }
19 | // }, {
20 | // title: data.title,
21 | // buttons: ["确认更新", "取消"],
22 | // verticalAlign: "bottom"
23 | // });
24 | // });
25 | // },
26 | // success() {
27 | // console.log('安装成功')
28 | // plus.runtime.restart(); // 重启app
29 | // plus.nativeUI.closeWaiting();
30 | // },
31 | // error(e) {
32 | // // 错误显示
33 | // plus.nativeUI.closeWaiting();
34 | // console.log("安装wgt文件失败[" + e.code + "]:" + e.message);
35 | // plus.nativeUI.alert("安装wgt文件失败[" + e.code + "]:" + e.message);
36 | // },
37 | // onProgress(p) {
38 | // console.log(p) // 下载进度
39 | // }
40 | // });
41 |
42 | Vue.config.productionTip = false;
43 |
44 | /* eslint-disable no-new */
45 | new Vue({
46 | el: "#app",
47 | components: { App },
48 | template: ""
49 | });
50 |
--------------------------------------------------------------------------------
/docs/guide/qa.md:
--------------------------------------------------------------------------------
1 | # 常见问题
2 |
3 | 常见问题一般来说就是白屏问题,或者页面不存在,可能有以下几种情况
4 |
5 | **Q1:删除一些页面后控制台报错**
6 |
7 | 这是由于`HtmlWebpackPlugin`没有找到模板的问题,只需要重新`npm start`即可.
8 |
9 | **Q2:`npm start`控制台报语法错误**
10 |
11 | 请升级你的 node 到最新版本
12 |
13 | **Q3:`npm start`后出现空白页面无法显示**
14 |
15 | 1. 电脑和调试的手机需要在同一个局域网下面
16 | 2. `npm start`后如果局域网 ip 地址有变,请同时在 manifest.json 中修改页面入口
17 |
18 | ## 速度优化方案
19 |
20 | 最近许多反映脚手架很慢的可以参考一下优化方案,可以大大提高调试/打包速度.
21 |
22 | 1.2 的版本中移除了一些不必要的插件,应该会快那么一点吧.追求速度的继续往下看.
23 |
24 | 由于 demo 需要展示各种 ui,加载了各种的 ui 的 loader,所以如果开发者用不到可以将其移除.
25 |
26 | ### 1.如果不使用 VUX
27 |
28 | 注释掉 `vux-loader` 即可,在`webpack.base.conf.js`中,修改以下代码
29 |
30 | ```js
31 | const vuxLoader = require("vux-loader");
32 |
33 | module.exports = vuxLoader.merge(webpackConfig, {
34 | plugins: ["vux-ui"]
35 | });
36 | ```
37 |
38 | 修改后
39 |
40 | ```js
41 | module.exports = webpackConfig;
42 | ```
43 |
44 | ### 2.如果不使用 vant
45 |
46 | 移除掉`.babalrc`中以下代码
47 |
48 | ```json
49 | [
50 | "import",
51 | {
52 | "libraryName": "vant",
53 | "libraryDirectory": "es",
54 | "style": true
55 | }
56 | ]
57 | ```
58 |
59 | ## 自定义返回按钮事件
60 |
61 | 演示可以在 demo 中购物车页面查看,实现代码如下
62 |
63 | ```js
64 | plus.key.removeEventListener("backbutton", function() {
65 | console.log(5555);
66 | });
67 | plus.key.addEventListener(
68 | "backbutton",
69 | function() {
70 | // nativeUI.conf
71 | // nativeUI.con
72 | confirm("确认要离开么?").then(e => {
73 | if (e.index === 0) {
74 | plus.nativeUI.toast("离开了");
75 | const ws = plus.webview.currentWebview();
76 | ws.hide();
77 | } else {
78 | plus.nativeUI.toast("留住了");
79 | }
80 | });
81 | },
82 | false
83 | );
84 | ```
85 |
--------------------------------------------------------------------------------
/docs/guide/introduction.md:
--------------------------------------------------------------------------------
1 | # 介绍
2 |
3 | > MogoH5+ 是以一个 `vue+webpack` 的多页面脚手架,配合[HTML5+](http://www.html5plus.org/doc/h5p.html)使用可以快速开发安卓/苹果应用.
4 |
5 | 
6 |
7 | 下载 DEMO 体验[MogoH5+](https://fir.im/p52j)
8 |
9 | 文档是以`1.3.0`的基础上编写,如果您正在使用老版本出现问题,请加入 QQ 群 780150310 询问
10 |
11 | ## 特点
12 |
13 | - **Vue 支持** 通过 vue 框架双向绑定等优点,可以快速开发出响应式 app 界面
14 | - **ES6/ES7 支持** 支持使用 `ES7/ES8`甚至更加新的 ES 规范,享受 `async/await`
15 | - **热更新** 支持`热更新`,自动化热更新平台正在内测中
16 | - **npm 生态** 支持使用 `npm` 安装管理第三方依赖
17 | - **css 预编译** 支持使用 `Less` 等
18 | - **局域网调试** 无须数据线连接即可`调试`
19 | - **vconsole 支持** 手机上享受`Chrome Dev Tools`一样的体验
20 |
21 | 想继续写,估计还可以写很多,很多...大概表达就是,这个东西很强大!
22 |
23 | ## 什么是 HTML5+
24 |
25 | `HTML5+` 是一个运行环境,在这个环境下的网页都可以使用 `HTML5+`的 API,比如摄像头,定位,推送等原生 APP 才有的功能.
26 |
27 | 而这个运行环境的壳需要用`Hbuilder`来生成,所以需要搭配`Hbuilder`使用.
28 |
29 | ## 入门解疑
30 |
31 | 如果你要开发大型复杂 APP,游戏,请绕道....
32 |
33 | ### 兼容问题
34 |
35 | `webapp`的本质就是`webview`,`webviwe` 也已经非常的成熟,比如小程序,因此,你知道如何处理网页兼容问题就可以了
36 |
37 | ### 性能问题
38 |
39 | 使用多`webview`来管理窗口,几乎满足大多数中小型 APP 的开发,可以安装 Demo 体验.
40 |
41 | 目前手机的性能越来越强,只要使用规范,可以接近原生界面.
42 |
43 | ### 与 mui 的关系
44 |
45 | `mui`只是一个 ui 框架,`mui.js`中封装了很多`HTML5+`的方法.如果您追求性能,我们建议您最好不要使用任何 ui 框架.
46 |
47 | ## 赞助
48 |
49 | 您的赞助会使`MogoH5+`发展的更好,所赞助的资金都将提升`FEmirror 云更新`服务.
50 |
51 | | 微信 | 支付宝 |
52 | | ---------------------------------------------------------- | ------------------------------------------------------------- |
53 | |
|
|
54 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | mogo-h5plus
4 |
5 |
6 |
7 |
8 |
9 | com.aptana.ide.core.unifiedBuilder
10 |
11 |
12 |
13 |
14 | com.pandora.projects.ui.MKeyBuilder
15 |
16 |
17 |
18 |
19 |
20 | com.pandora.projects.ui.MKeyNature
21 | com.aptana.projects.webnature
22 |
23 |
24 |
25 | 1528104404363
26 |
27 | 26
28 |
29 | org.eclipse.ui.ide.multiFilter
30 | 1.0-name-matches-false-false-node_modules
31 |
32 |
33 |
34 | 1528770016589
35 |
36 | 26
37 |
38 | org.eclipse.ui.ide.multiFilter
39 | 1.0-name-matches-false-false-node_modules
40 |
41 |
42 |
43 | 1530342398198
44 |
45 | 26
46 |
47 | org.eclipse.ui.ide.multiFilter
48 | 1.0-name-matches-false-false-node_modules
49 |
50 |
51 |
52 | 1530684374172
53 |
54 | 26
55 |
56 | org.eclipse.ui.ide.multiFilter
57 | 1.0-name-matches-false-false-node_modules
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/src/page/user/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
5 |
6 | 待付款
7 |
8 |
9 | 待接单
10 |
11 |
12 | 待发货
13 |
14 |
15 | 待发货
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
43 |
44 |
66 |
--------------------------------------------------------------------------------
/src/page/mui/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Mui V2.0
11 |
这里主要演示MUI的一些样式和JS,我仍然推荐您使用其他vueUI(Vux,Vant,mint)来代替mui
12 |
13 |
14 |
15 |
16 |
30 |
31 |
32 | -
33 | 面板1
34 |
37 |
38 |
39 |
40 |
41 |
42 |
59 |
60 |
62 |
--------------------------------------------------------------------------------
/docs/hotfix/old/introduction.md:
--------------------------------------------------------------------------------
1 | # 介绍
2 |
3 | > `Hotfix`+`FEmirror 云更新` 让您的 H5+应用快速拥有热更新功能.
4 |
5 | 只需`几分钟`,让您的应用拥有更新能力!
6 |
7 | | iphone 热更新 效果如下 | 安卓热更新效果如下 | 安卓安装更新如下 |
8 | | ---------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- |
9 | |
|
|
|
10 |
11 | ### Hotfix
12 |
13 | `Hotfix` 是一个适用于 H5+应用的一个`拓展库`.可以自动完成热更新,和安装更新任务.
14 |
15 | 只要您的 app 是使用 Hbuilder 开发的,就可以使用 `Hotfix`.具体接入方式请[查看教程](hotfix.md)
16 |
17 | ### 云更新
18 |
19 | `更新云` 是一个`app`版本更新的管理平台,提供版本更新服务.
20 |
21 | 单独的 `Hotfix` 还需要后端的协作,比如`版本管理`,`下载服务`.
22 |
23 | `FEmirror 云更新`就是为您提供`版本管理`,`下载服务`的服务的.
24 |
25 | ### 如何 3 分钟接入云更新
26 |
27 | #### 1.如果您是 MogoH5+ 开发者
28 |
29 | 如果您是`MogoH5+`的开发者,`1.3`后是内置了热更新,只要后端完成相关更新逻辑,就可以使用了.
30 |
31 | 如果想要更快的方式接入,可以使用`FEmirror 云更新`
32 |
33 | #### 2.如果您是 Hbuilder 开发者
34 |
35 | 如果您的应用是使用`mui`开发,也没有使用`Mogoh5+`,您可以以`
25 | ```
26 |
27 | ### 使用
28 |
29 | ```js
30 | hotfix({
31 | url: updateUrl,
32 | before(data) {
33 | // 确认安装
34 | return new Promise(resolve => {
35 | plus.nativeUI.confirm(data.title, (selected) => {
36 | if (selected.index === 0) {
37 | plus.nativeUI.showWaiting("下载更新文件...");
38 | resolve(data);
39 | }
40 | }, {
41 | title: data.description,
42 | buttons: ["确认更新", "取消"],
43 | verticalAlign: "bottom"
44 | });
45 | });
46 | },
47 | success() {
48 | console.log('安装成功')
49 | plus.runtime.restart(); // 重启app
50 | plus.nativeUI.closeWaiting();
51 | },
52 | error(e) {
53 | // 错误显示
54 | plus.nativeUI.closeWaiting();
55 | console.log("安装wgt文件失败[" + e.code + "]:" + e.message);
56 | plus.nativeUI.alert("安装wgt文件失败[" + e.code + "]:" + e.message);
57 | },
58 | onProgress(p) {
59 | console.log(p) // 下载进度
60 | }
61 | });
62 | ```
63 |
64 | ## 赞助
65 |
66 | 您的赞助会使`MogoH5+`发展的更好,所赞助的资金都将提升`FEmirror 云更新`服务.
67 |
68 | | 微信 | 支付宝 |
69 | | ---------------------------------------------------------- | ------------------------------------------------------------- |
70 | |
|
|
71 |
--------------------------------------------------------------------------------
/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ msg }}
4 |
Essential Links
5 |
48 |
Ecosystem
49 |
83 |
84 |
85 |
86 |
96 |
97 |
98 |
114 |
--------------------------------------------------------------------------------
/docs/hotfix/config.md:
--------------------------------------------------------------------------------
1 | # Hotfix配置
2 |
3 | 热更新能够不提交应用商店审核而修改 APP 内容,使得 app 的迭代变的非常灵活.
4 |
5 | `MogoH5+`在`1.3.0`后加入了`热更新/安装更新`的集成.同时,我们的`热更新服务器`也在内测中,将在不久公测使用.您无需后端就可以完成整个软件的`热更新/安装更新`服务.
6 |
7 | ## 介绍
8 |
9 | 在使用热更新前,请看完这份介绍再使用.
10 |
11 | ### 热更新
12 |
13 | 对于安卓来说,热更新是没有任何问题的,但是苹果您可以看下面这段话.
14 |
15 | #### App store 应用更新说明(引自 dcloud)
16 |
17 | > 应用资源更新肯定是违反 apple 政策的,但目前看起来它也不管。你在官网案例那里下载 Appstore 版本的那些 app,大多启动后都会提示更新,反正也都没下架。如果你不是很大的公司,apple 不会理睬你。如果你是大公司,建议不要做整体更新,每次更新几个页面,也不要提示更新后需要重启,这样会安全点。
18 |
19 | 作者本人的实践中也经常使用热更新,名声不大,不频繁基本上可以自由使用.
20 | 同样,我们加入了`静默更新`这种比较无脑的更新.
21 |
22 | ### 安装更新
23 |
24 | 安装更新在这里指的就是更新大版本,比如添加了模块,必须重新安装.
25 |
26 | #### 在安卓的安装更新
27 |
28 | 1. 可以让 APP 提示,然后用户选择自己下载安装
29 | 2. 应用商店更新
30 |
31 | #### 在苹果的安装更新
32 |
33 | 1. 必须提交 AppStore 提交审核
34 |
35 | 在这里顺便提一下,苹果用户的习惯一般是自己主动更新.
36 | 在苹果应用商店的大厂 app (微信,淘宝,京东) 更新几乎不会受到 app 的更新推送,也没有所谓`检查更新`的功能,也就是说,更新是用户主动操作的.我们的`迭代`同样也遵循这条`行规`.
37 |
38 |
39 | ## Hotfix参数
40 |
41 | |参数|说明|类型|
42 | |-|-|---|
43 | |`url`|更新请求地址|string|
44 | |`before(data)`| `data`返回的是请求后的`json`数据; 可在函数中执行安装前进行的操作,在此函数中,可以做一些确认操作,返回`Promise.resolve()`则执行下载安装,不返回或返回其他则不执行下载安装|`Promise`|
45 | |`success`|安装完成后执行的动作,比如重启app|`void`|
46 | |`error(e)`|返回error对象,一般在调试中使用|`Error`|
47 | |`onProgress(n)`|下载进度,`n`为0-100的下载进度|`int`|
48 |
49 |
50 |
51 | ## 后端接收的数据格式
52 |
53 | `checkUpdate(url)` 是以 `POST` 去访问 URL 的.数据类型为`application/json`
54 |
55 | | 名称 | 描述 | 类型 |
56 | | ------- | ------------------------------- | ------ |
57 | | version | app 当前的版本 ,如 2.1.0 | string |
58 | | os | app 设备的系统信息 比如系统版本 | json |
59 | | device | app 设备的设备信息 比如 uuid | json |
60 |
61 | ## 后端返回的数据格式
62 |
63 | 下面是一个完整的数据返回 返回格式为`application/json` ,返回状态码为`200`.
64 |
65 | > 注意 : 返回`200`以外的状态码将不被处理,如果想自行处理可以改写代码
66 |
67 | | 名称 | 描述 | 参数 |
68 | | -------------- | --------------------------------------------------------------- | ------------------------ |
69 | | name | 版本号 如果检测的版本大于本地版本就会更新 | string |
70 | | title | 升级提示标题 | string |
71 | | description | 升级提示内容 | string |
72 | | platform | 符合升级的平台 ios:升级苹果 android:升级安卓 both:都更新 | `ios` ,`android`, `both` |
73 | | hotupdate_type | 更新提示 silence:静默更新 tip:提示更新 (apk 的安装是需要提示的) | `silence`,`tip` |
74 | | android_url | 更新下载地址 以`.apk`,`.wgt`结尾的 http 地址 | url |
75 |
--------------------------------------------------------------------------------
/src/utils/common.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 该js为所有页面都必须加载的js
3 | * 可以用于全局添加某功能
4 | */
5 | import FastClick from "fastclick";
6 | // 去除300ms延迟
7 | document.addEventListener(
8 | "DOMContentLoaded",
9 | function() {
10 | FastClick.attach(document.body);
11 | },
12 | false
13 | );
14 |
15 | // 自动关闭窗口 可根据具体逻辑自定义
16 | function plusReady() {
17 | plus.key.addEventListener(
18 | "backbutton",
19 | function () {
20 | var ws = plus.webview.currentWebview();
21 | if (ws.webviewPreload == true) {
22 | plus.webview.hide(ws, 'auto');
23 | } else {
24 | plus.webview.close(ws, 'auto');
25 | }
26 | },
27 | false
28 | );
29 | }
30 | if (window.plus) {
31 | plusReady();
32 | } else {
33 | document.addEventListener("plusready", plusReady, false);
34 | }
35 | // 页面调试工具
36 | var print = function (json, options) {
37 | var reg = null,
38 | formatted = "",
39 | pad = 0,
40 | PADDING = " ";
41 | options = options || {};
42 | options.newlineAfterColonIfBeforeBraceOrBracket =
43 | options.newlineAfterColonIfBeforeBraceOrBracket === true ? true : false;
44 | options.spaceAfterColon = options.spaceAfterColon === false ? false : true;
45 | if (typeof json !== "string") {
46 | json = JSON.stringify(json);
47 | } else {
48 | json = JSON.parse(json);
49 | json = JSON.stringify(json);
50 | }
51 | reg = /([\{\}])/g;
52 | json = json.replace(reg, "\r\n$1\r\n");
53 | reg = /([\[\]])/g;
54 | json = json.replace(reg, "\r\n$1\r\n");
55 | reg = /(\,)/g;
56 | json = json.replace(reg, "$1\r\n");
57 | reg = /(\r\n\r\n)/g;
58 | json = json.replace(reg, "\r\n");
59 | reg = /\r\n\,/g;
60 | json = json.replace(reg, ",");
61 | if (!options.newlineAfterColonIfBeforeBraceOrBracket) {
62 | reg = /\:\r\n\{/g;
63 | json = json.replace(reg, ":{");
64 | reg = /\:\r\n\[/g;
65 | json = json.replace(reg, ":[");
66 | }
67 | if (options.spaceAfterColon) {
68 | reg = /\:/g;
69 | json = json.replace(reg, ":");
70 | }
71 | json.split("\r\n").forEach(function (node, index) {
72 | //console.log(node);
73 | var i = 0,
74 | indent = 0,
75 | padding = "";
76 |
77 | if (node.match(/\{$/) || node.match(/\[$/)) {
78 | indent = 1;
79 | } else if (node.match(/\}/) || node.match(/\]/)) {
80 | if (pad !== 0) {
81 | pad -= 1;
82 | }
83 | } else {
84 | indent = 0;
85 | }
86 |
87 | for (i = 0; i < pad; i++) {
88 | padding += PADDING;
89 | }
90 |
91 | formatted += padding + node + "\r\n";
92 | pad += indent;
93 | });
94 | console.log(formatted);
95 | };
--------------------------------------------------------------------------------
/src/utils/webview.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 打开一个webview窗口
3 | */
4 | export function openWebview(config, style = {}, extras = {}) {
5 | var wv = plus.webview.create(
6 | config.url,
7 | config.id,
8 | {
9 | top: 0, // 新页面顶部位置
10 | bottom: 0, // 新页面底部位置
11 | render: "always",
12 | popGesture: "hide",
13 | bounce: "vertical",
14 | bounceBackground: "#efeff4",
15 | titleNView: {
16 | // 详情页原生导航配置
17 | backgroundColor: "#f7f7f7", // 导航栏背景色
18 | titleText: config.title, // 导航栏标题
19 | titleColor: "#000000", // 文字颜色
20 | type: "transparent", // 透明渐变样式
21 | autoBackButton: true, // 自动绘制返回箭头
22 | splitLine: {
23 | // 底部分割线
24 | color: "#cccccc"
25 | }
26 | },
27 | ...style
28 | },
29 | extras
30 | );
31 | var w = plus.nativeUI.showWaiting();
32 | // 监听窗口加载成功
33 | wv.addEventListener(
34 | "loaded",
35 | function () {
36 | wv.show("slide-in-right"); // 显示窗口
37 | w.close();
38 | w = null;
39 | },
40 | false
41 | );
42 | }
43 |
44 | // webview.open 打开得很快 但是不能传参
45 | export function openWebviewFast(url, id, title) {
46 | plus.nativeUI.showWaiting("加载中");
47 | plus.webview.open(
48 | url,
49 | id,
50 | {
51 | titleNView: {
52 | backgroundColor: "#f7f7f7", // 导航栏背景色
53 | titleText: title, // 导航栏标题
54 | titleColor: "#666", // 文字颜色
55 | // type: "transparent", // 透明渐变样式
56 | autoBackButton: true, // 自动绘制返回箭头
57 | splitLine: {
58 | // 底部分割线
59 | color: "#cccccc"
60 | }
61 | },
62 | },
63 | "slide-in-right",
64 | 420,
65 | function () {
66 | plus.nativeUI.closeWaiting();
67 | }
68 | );
69 | }
70 | // 预加载页面 速度很快,但是不要加载超过10个
71 | export function preLoad(webviews = []) {
72 | webviews.map(webview => {
73 | const fullExtras = {
74 | webviewPreload: true,
75 | ...webview.extras
76 | };
77 | plus.webview.create(
78 | webview.url,
79 | webview.id,
80 | {
81 | top: 0, // 新页面顶部位置
82 | bottom: 0, // 新页面底部位置
83 | render: "always",
84 | popGesture: "hide",
85 | bounce: "vertical",
86 | bounceBackground: "#efeff4",
87 | titleNView: {
88 | // 详情页原生导航配置
89 | backgroundColor: "#f7f7f7", // 导航栏背景色
90 | titleText: webview.title, // 导航栏标题
91 | titleColor: "#000000", // 文字颜色
92 | type: "transparent", // 透明渐变样式
93 | autoBackButton: true, // 自动绘制返回箭头
94 | splitLine: {
95 | // 底部分割线
96 | color: "#cccccc"
97 | }
98 | },
99 | ...webview.style
100 | },
101 | fullExtras
102 | );
103 | });
104 | }
105 |
106 | export function showWebviewById(id) {
107 | plus.webview.show(id, "slide-in-right", 200);
108 | }
109 |
--------------------------------------------------------------------------------
/docs/guide/update_log.md:
--------------------------------------------------------------------------------
1 | # 更新日志
2 |
3 | 
4 |
5 | ### 1.3.0 [20180727]
6 |
7 | #### [新增]
8 |
9 | 1. 增加`热更新/迭代`集成,具体文档查看[热更新/迭代](../practice/hotfix.md)
10 | 2. 增加自定义返回实现,返回按钮可以[自定义返回按钮事件](./qa.html#自定义返回按钮事件)
11 | 3. 增加"商品加入购物车"功能实例演示页面间通讯
12 | 4. 新增 VConsole 以 webpack 插件的形式加载,`run build`会自动去掉
13 |
14 | #### [修复]
15 |
16 | 1. 修复了超多页面下调试慢的问题,使用`html-webpack-plugin-for-multihtml`解决
17 | 2. 修改了版本文档
18 |
19 | #### [升级指导]
20 |
21 | 1. 将 VConsole 在 common.js 中删掉,因为已经以 webpack 插件形式加载
22 | 2. `utils` 是我们会经常修改的, 如果有自己的工具库,请另建文件夹
23 |
24 | ### 1.2.0 [20180719]
25 |
26 | #### [新增]
27 |
28 | - 增加预加载窗口打开方式,根据不同场景使用不同的打开方式,可以大大提高 webview 的打开速度,首页已加入使用案例
29 | - 由于 VConsole 并不能解决全部调试问题,增加一个`print`方法,用于在 Hbuilder 上打印对象
30 |
31 | #### [速度优化方案]
32 |
33 | 最近许多反映脚手架很慢的可以参考一下优化方案,可以大大提高调试/打包速度.
34 |
35 | 1.2 的版本中移除了一些不必要的插件,应该会快那么一点吧.追求速度的继续往下看.
36 |
37 | 由于 demo 需要展示各种 ui,加载了各种的 ui 的 loader,所以如果开发者用不到可以将其移除.
38 |
39 | ##### 1.如果不使用 VUX
40 |
41 | 注释掉 `vux-loader` 即可,在`webpack.base.conf.js`中,修改以下代码
42 |
43 | ```
44 | const vuxLoader = require("vux-loader");
45 |
46 | module.exports = vuxLoader.merge(webpackConfig, {
47 | plugins: ["vux-ui"]
48 | });
49 | ```
50 |
51 | 修改后
52 |
53 | ```
54 | module.exports = webpackConfig;
55 | ```
56 |
57 | ##### 2.如果不使用 vant
58 |
59 | 移除掉`.babalrc`中以下代码
60 |
61 | ```
62 | [
63 | "import",
64 | {
65 | "libraryName": "vant",
66 | "libraryDirectory": "es",
67 | "style": true
68 | }
69 | ]
70 | ```
71 |
72 | ##### 3.优化建议
73 |
74 | 对于一些简单的页面其实可以不用 ui 框架,加载的时候会很快
75 | 使用 ui 框架大概也只会增加 100-200ms 的 js 运行时间,窗口过渡 200ms 的话,基本上不会影响用户体验
76 | 如果使用大量组件,增加的时间可能会比较大,这个时候可以考虑预加载这个窗口了.
77 |
78 | 参考:http://ask.dcloud.net.cn/article/25
79 |
80 | #### [升级方案]
81 |
82 | 几乎每个版本都是兼容的,所以只要将`src`中的文件转移到新版本就 ok 啦!
83 |
84 | #### [终极解决:webpack4]
85 |
86 | 由于官方的 `webpack3` 脚手架速度也提升不了多少了,所以 `1.2` 之后的 `1.x` 版本之后可能几乎不会对脚手架做修改了,只会增加很多实用的使用案例和工具方法
87 |
88 | 不过现在已经开始对 `webpack4` 开始研究了 webpack4 `2.0`版本见啦
89 |
90 | ### 1.1.0 [20180706]
91 |
92 | #### [新增]
93 |
94 | - `page.json`可以配置是否加载 mui 或者是否使用 plusready
95 | - 增加`fire`页面传值函数,详情可见商品详情页和首页的自定义事件
96 |
97 | #### [修复]
98 |
99 | - 修复了资源路径加载问题(需修改`page.json`配置)
100 | - 修复了 mui 加载不灵活的问题,减少打包的体积
101 | - 修复了 mui 字体文件加载失败的问题
102 |
103 | #### 1.0.x 到 1.1.x
104 |
105 | 由于之前资源路径的问题,目前的解决方案是修改`page.json`的配置,将原来的以路径作为键`mui/index`写成`mui.index`即可,如下
106 |
107 | 如果要使用 mui 就加入 `|mui`, 如果要使用 mui 就加入 `|plusReady`,不用则不加.
108 |
109 | > plusReady 在安卓手机上提前载入可能会影响页面打开速度,解决方法有两种:1 不提前使 plus 生效 2.预加载 plus
110 |
111 | ```json
112 | {
113 | "mui.index|mui|plusReady": "./src/page/mui/index.js"
114 | }
115 | ```
116 |
117 | #### 注意事项
118 |
119 | 请在`created`生命周期里面接收事件,否则会因为视图刷新多次执行.
120 |
121 | ### 1.0.1 [20180704]
122 |
123 | - 修复了 background 图片路径打包后不正确的问题
124 |
125 | ### 1.0.0 [20180630]
126 |
127 | - 使用 vue 官方脚手架作为基层,健壮性得到`史诗级`提升
128 | - 添加了 vux 的支持
129 | - 修改的 mui 的加载方式
130 | - 配置方面有部分变化,详情请看文档
131 | - 升级了安卓 app
132 |
133 | ### 0.3.0 [20180628]
134 |
135 | - 解决了因为新增/删除页面导致的 webpack 错误
136 | - 添加了 openWebview 的 extras 参数
137 |
138 | ### 0.2.0 [20180623]
139 |
140 | - 添加了对 mui 样式和 js 的支持
141 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mogo-h5plus",
3 | "version": "1.3.0",
4 | "description": "A Scaffolding To Develop H5+ App Fast.",
5 | "author": "ArH <626019610@qq.com>",
6 | "private": true,
7 | "scripts": {
8 | "dev": "nodemon -e json --exec \"webpack-dev-server --inline --progress --config build/webpack.dev.conf.js\"",
9 | "start": "npm run dev",
10 | "unit": "jest --config test/unit/jest.conf.js --coverage",
11 | "test": "npm run unit",
12 | "build": "node build/build.js",
13 | "lint": "eslint --ext .js,.vue src test/unit",
14 | "docs:dev": "cd docs && vuepress dev",
15 | "docs:publish": "cd docs && ./deploy.sh"
16 | },
17 | "dependencies": {
18 | "axios": "^0.18.0",
19 | "fastclick": "git+https://github.com/mogoclub/fastclick.git",
20 | "h5plus-hotfix": "^1.0.1",
21 | "vant": "^1.1.10",
22 | "vconsole": "^3.2.0",
23 | "vue": "^2.5.2",
24 | "vux": "^2.9.2"
25 | },
26 | "devDependencies": {
27 | "autoprefixer": "^7.1.2",
28 | "babel-core": "^6.22.1",
29 | "babel-eslint": "^8.2.1",
30 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
31 | "babel-jest": "^21.0.2",
32 | "babel-loader": "^7.1.1",
33 | "babel-plugin-dynamic-import-node": "^1.2.0",
34 | "babel-plugin-import": "^1.8.0",
35 | "babel-plugin-syntax-jsx": "^6.18.0",
36 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
37 | "babel-plugin-transform-runtime": "^6.22.0",
38 | "babel-plugin-transform-vue-jsx": "^3.5.0",
39 | "babel-preset-env": "^1.3.2",
40 | "babel-preset-stage-2": "^6.22.0",
41 | "chalk": "^2.0.1",
42 | "copy-webpack-plugin": "^4.0.1",
43 | "css-loader": "^0.28.0",
44 | "eslint": "^4.15.0",
45 | "eslint-config-standard": "^10.2.1",
46 | "eslint-friendly-formatter": "^3.0.0",
47 | "eslint-loader": "^1.7.1",
48 | "eslint-plugin-import": "^2.7.0",
49 | "eslint-plugin-node": "^5.2.0",
50 | "eslint-plugin-promise": "^3.4.0",
51 | "eslint-plugin-standard": "^3.0.1",
52 | "eslint-plugin-vue": "^4.0.0",
53 | "extract-text-webpack-plugin": "^3.0.0",
54 | "file-loader": "^1.1.4",
55 | "friendly-errors-webpack-plugin": "^1.6.1",
56 | "html-webpack-plugin": "^2.30.1",
57 | "html-webpack-plugin-for-multihtml": "^2.30.2",
58 | "jest": "^22.0.4",
59 | "jest-serializer-vue": "^0.3.0",
60 | "less": "^3.0.4",
61 | "less-loader": "^4.1.0",
62 | "node-notifier": "^5.1.2",
63 | "nodemon": "^1.17.5",
64 | "optimize-css-assets-webpack-plugin": "^3.2.0",
65 | "ora": "^1.2.0",
66 | "portfinder": "^1.0.13",
67 | "postcss-import": "^11.0.0",
68 | "postcss-loader": "^2.0.8",
69 | "postcss-url": "^7.2.1",
70 | "rimraf": "^2.6.0",
71 | "semver": "^5.3.0",
72 | "shelljs": "^0.7.6",
73 | "uglifyjs-webpack-plugin": "^1.1.1",
74 | "url-loader": "^0.5.8",
75 | "vconsole-webpack-plugin": "^1.4.0",
76 | "vue-jest": "^1.0.2",
77 | "vue-loader": "^13.3.0",
78 | "vue-style-loader": "^3.0.1",
79 | "vue-template-compiler": "^2.5.2",
80 | "vux-loader": "^1.2.9",
81 | "webpack": "^3.6.0",
82 | "webpack-bundle-analyzer": "^2.9.0",
83 | "webpack-dev-server": "^2.9.1",
84 | "webpack-merge": "^4.1.0"
85 | },
86 | "engines": {
87 | "node": ">= 6.0.0",
88 | "npm": ">= 3.0.0"
89 | },
90 | "browserslist": [
91 | "> 1%",
92 | "last 2 versions",
93 | "not ie <= 8"
94 | ]
95 | }
96 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // Template version: 1.3.1
3 | // see http://vuejs-templates.github.io/webpack for documentation.
4 |
5 | const path = require("path");
6 | const ip = require("ip");
7 | module.exports = {
8 | dev: {
9 | // Paths
10 | vConsole: true, //是否显示VConsole
11 | assetsSubDirectory: "static",
12 | assetsPublicPath: "/",
13 | proxyTable: {
14 | "/api": {
15 | name: "DOUBANAPI",
16 | target: "https://api.douban.com",
17 | pathRewrite: { "^/api": "" },
18 | changeOrigin: true,
19 | secure: false
20 | },
21 | "/localApi": {
22 | name: "LOCALAPI",
23 | target: "http://127.0.0.1:7001",
24 | pathRewrite: { "^/localApi": "" },
25 | changeOrigin: true,
26 | secure: false
27 | },
28 | "/femirror": {
29 | name: "FemirrorAPI",
30 | target: "https://api.hotfix.femirror.com",
31 | pathRewrite: { "^/femirror": "" },
32 | changeOrigin: true,
33 | secure: false
34 | }
35 | },
36 |
37 | // Various Dev Server settings
38 | host: ip.address(), // can be overwritten by process.env.HOST
39 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
40 | autoOpenBrowser: false,
41 | errorOverlay: true,
42 | notifyOnErrors: true,
43 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
44 |
45 | // Use Eslint Loader?
46 | // If true, your code will be linted during bundling and
47 | // linting errors and warnings will be shown in the console.
48 | useEslint: true,
49 | // If true, eslint errors and warnings will also be shown in the error overlay
50 | // in the browser.
51 | showEslintErrorsInOverlay: false,
52 |
53 | /**
54 | * Source Maps
55 | */
56 |
57 | // https://webpack.js.org/configuration/devtool/#development
58 | devtool: "cheap-module-eval-source-map",
59 |
60 | // If you have problems debugging vue-files in devtools,
61 | // set this to false - it *may* help
62 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
63 | cacheBusting: true,
64 |
65 | cssSourceMap: true
66 | },
67 |
68 | build: {
69 |
70 | vConsole: true, //是否显示VConsole
71 | // Template for index.html
72 | index: path.resolve(__dirname, "../dist/index.html"),
73 |
74 | // Paths
75 | assetsRoot: path.resolve(__dirname, "../dist"),
76 | assetsSubDirectory: "assets",
77 | assetsPublicPath: "/",
78 |
79 | /**
80 | * Source Maps
81 | */
82 |
83 | productionSourceMap: false,
84 | // https://webpack.js.org/configuration/devtool/#production
85 | // devtool: '#source-map',
86 |
87 | // Gzip off by default as many popular static hosts such as
88 | // Surge or Netlify already gzip all static assets for you.
89 | // Before setting to `true`, make sure to:
90 | // npm install --save-dev compression-webpack-plugin
91 | productionGzip: false,
92 | productionGzipExtensions: ["js", "css"],
93 |
94 | // Run the build command with an extra argument to
95 | // View the bundle analyzer report after build finishes:
96 | // `npm run build --report`
97 | // Set to `true` or `false` to always turn it on or off
98 | bundleAnalyzerReport: process.env.npm_config_report
99 | }
100 | };
101 |
--------------------------------------------------------------------------------
/src/page/goods/cart.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
17 |
18 |
19 |
25 |
26 |
27 |
28 |
127 |
128 |
--------------------------------------------------------------------------------
/src/page/vux/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
THX to: https://github.com/wechatui/swiper
4 |
list模式下,默认高度为180px, 如果设置aspect-ratio会根据宽度自动计算高度
5 |
6 |
Image Source: http://www.gratisography.com/
7 |
current index: {{demo01_index}}
8 |
go to 0
9 |
go to 1
10 |
go to 2
11 |
12 |
13 |
14 |
15 |
16 |
17 |
115 |
116 |
--------------------------------------------------------------------------------
/docs/hotfix/old/hotfix.md:
--------------------------------------------------------------------------------
1 | # Hotfix [项目地址](https://github.com/tyaqing/hotfix)
2 |
3 | 热更新能够不提交应用商店审核而修改 APP 内容,使得 app 的迭代变的非常灵活.
4 |
5 | `MogoH5+`在`1.3.0`后加入了`热更新/安装更新`的集成.同时,我们的`热更新服务器`也在内测中,将在不久公测使用.您无需后端就可以完成整个软件的`热更新/安装更新`服务.
6 |
7 | | iphone 热更新 效果如下 | 安卓热更新效果如下 | 安卓安装更新如下 |
8 | | ---------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- |
9 | |
|
|
|
10 |
11 | ## 介绍
12 |
13 | 在使用热更新前,请看完这份介绍再使用.
14 |
15 | ### 热更新
16 |
17 | 对于安卓来说,热更新是没有任何问题的,但是苹果您可以看下面这段话.
18 |
19 | #### App store 应用更新说明(引自 dcloud)
20 |
21 | > 应用资源更新肯定是违反 apple 政策的,但目前看起来它也不管。你在官网案例那里下载 Appstore 版本的那些 app,大多启动后都会提示更新,反正也都没下架。如果你不是很大的公司,apple 不会理睬你。如果你是大公司,建议不要做整体更新,每次更新几个页面,也不要提示更新后需要重启,这样会安全点。
22 |
23 | 作者本人的实践中也经常使用热更新,名声不大,不频繁基本上可以自由使用.
24 | 同样,我们加入了`静默更新`这种比较无脑的更新.
25 |
26 | ### 安装更新
27 |
28 | 安装更新在这里指的就是更新大版本,比如添加了模块,必须重新安装.
29 |
30 | #### 在安卓的安装更新
31 |
32 | 1. 可以让 APP 提示,然后用户选择自己下载安装
33 | 2. 应用商店更新
34 |
35 | #### 在苹果的安装更新
36 |
37 | 1. 必须提交 AppStore 提交审核
38 |
39 | 在这里顺便提一下,苹果用户的习惯一般是自己主动更新.
40 | 在苹果应用商店的大厂 app (微信,淘宝,京东) 更新几乎不会受到 app 的更新推送,也没有所谓`检查更新`的功能,也就是说,更新是用户主动操作的.我们的`迭代`同样也遵循这条`行规`.
41 |
42 | ## 引入方式
43 |
44 | 可以在`main.js`中添加`checkUpdate(URL);`,打开 app 就会自动检测.还可以放在`检查更新`的按钮上触发.
45 |
46 | ### ES6 Module 引入
47 |
48 | 首先在`page.json`把用到`checkUpdate`的页面加上管道`|plusReady`.
49 |
50 | 然后加载使用.
51 |
52 | ```js
53 | import { checkUpdate } from "./utils/hotfix";
54 | checkUpdate(URL); // 填入您检查api的url地址
55 | ```
56 |
57 | ### ` // 这段必须加载title底下
64 | ....
65 |
66 |
69 | ```
70 |
71 | ## 热更新配置
72 |
73 | 热更新分为两种,在 ios 和安卓都可以使用:
74 |
75 | 1. 静默更新 : 使用`checkUpdate`方法后检查更新,如果有更新会自动下载 app,整个过程没有任何提示,用户第二次打开 app 就会出现更新后的效果.
76 | 2. 提示更新 : 使用`checkUpdate`方法后检查更新,如果有则会弹出确认框,用户确认后会提示正在下载,正在安装,安装完成重启,更新完成等提示.
77 |
78 | 如果您更新后不想立即重启,可以注释掉`hotfix.js`中的函数`plus.runtime.restart();`,这样,app 会在用户第二打开的时候自动完成更新.
79 |
80 | ## 后端接收的数据格式
81 |
82 | `checkUpdate(url)` 是以 `POST` 去访问 URL 的.数据类型为`application/json`
83 |
84 | | 名称 | 描述 | 类型 |
85 | | ------- | ------------------------------- | ------ |
86 | | version | app 当前的版本 ,如 2.1.0 | string |
87 | | os | app 设备的系统信息 比如系统版本 | json |
88 | | device | app 设备的设备信息 比如 uuid | json |
89 |
90 | ## 后端返回的数据格式
91 |
92 | 下面是一个完整的数据返回 返回格式为`application/json` ,返回状态码为`200`.
93 |
94 | > 注意 : 返回`200`以外的状态码将不被处理,如果想自行处理可以改写代码
95 |
96 | | 名称 | 描述 | 参数 |
97 | | -------------- | --------------------------------------------------------------- | ------------------------ |
98 | | name | 版本号 如果检测的版本大于本地版本就会更新 | string |
99 | | title | 升级提示标题 | string |
100 | | description | 升级提示内容 | string |
101 | | platform | 符合升级的平台 ios:升级苹果 android:升级安卓 both:都更新 | `ios` ,`android`, `both` |
102 | | type | 安装类型 wgt:热更新 apk:安装更新 | `wgt`,`apk` |
103 | | hotupdate_type | 更新提示 silence:静默更新 tip:提示更新 (apk 的安装是需要提示的) | `silence`,`tip` |
104 | | android_url | 更新下载地址 以`.apk`,`.wgt`结尾的 http 地址 | url |
105 |
106 | 下面这段`json`可以表达为:
107 |
108 | 1. 更新平台为 `全部平台`
109 | 2. `热更新`
110 | 3. `提示更新`
111 |
112 | ```json
113 | {
114 | "name": "2.2.1",
115 | "title": "发现新版本,快来使用吧!",
116 | "description": "1.增加了....\n 2.修复了... 3.杀了一个程序员祭天",
117 | "platform": "both",
118 | "type": "wgt",
119 | "hotupdate_type": "tip",
120 | "android_url": "http://cdn.femirror.com/H5FD926B1.wgt"
121 | }
122 | ```
123 |
--------------------------------------------------------------------------------
/src/page/goods/detail.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | {{ goods.title }}
12 | {{ formatPrice(goods.price) }}
13 |
14 |
15 | 运费:{{ goods.express }}
16 | 剩余:{{ goods.remain }}
17 |
18 |
19 |
20 |
21 |
22 |
23 | 有赞的店
24 | 官方
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | 客服
38 |
39 |
40 | 购物车
41 |
42 |
43 | 触发首页事件
44 |
45 |
46 | 立即购买
47 |
48 |
49 |
50 |
51 |
52 |
130 |
131 |
160 |
--------------------------------------------------------------------------------
/docs/guide/development.md:
--------------------------------------------------------------------------------
1 | # 开发
2 |
3 | ## 下载脚手架
4 |
5 | 首先下载脚手架
6 | 脚手架项目地址[MogoH5+](https://github.com/tyaqing/mogo-h5plus)
7 |
8 | ### Git clone
9 |
10 | ```bash
11 | git clone https://github.com/tyaqing/mogo-h5plus.git
12 | ```
13 |
14 | ### 直接下载
15 |
16 | [下载地址](https://github.com/tyaqing/mogo-h5plus/archive/master.zip)
17 |
18 | 下载后把目录直接导入到 Hbuilder.
19 |
20 | ## 运行脚手架
21 |
22 | ```bash
23 | // 1 进入项目主目录
24 | cd mogo-h5plus
25 | // 2 安装npm依赖
26 | npm i // 或者 yarn 请不要使用cnpm
27 | // 3 调试运行
28 | npm start
29 |
30 | // 运行结果如下
31 | ℹ 「wds」: Project is running at http://192.168.199.155:8080/
32 | ℹ 「wds」: webpack output is served from /
33 | ℹ 「wdm」: Hash: e597725cca065f694fbd
34 | Version: webpack 4.10.2
35 | Time: 4959ms
36 | ```
37 |
38 | 直接下载项目然后根据需求定制打包,最后通过 Hbuilder 云打包即可生成 APP.
39 |
40 | > 本文自带一个案例是使用 VantUI 开发的几个界面,如果你喜欢其他 UI 同样可以替换成其他的 UI.
41 |
42 | ## 真机调试
43 |
44 | 将打印出来的 ip 地址,我们打印出来的是`http://192.168.199.155:8080/`,将这个填入页面入口.
45 |
46 | 
47 |
48 | 然后使用 Hbuilder 基座进行调试测试.
49 |
50 | 
51 |
52 | ## 新建页面
53 |
54 | 假如我们要新建一个名称为`list`的页面作为商品列表,我们就要在`./src/page/goods`下新建`list.js`和`list.vue`两个文件.`list.js`作为多页面的入口,`list.vue`,脚手架自带了几个页面可供参考.
55 |
56 | ```json
57 | {
58 | "index|plusReady": "./src/main.js",
59 | "goods.detail": "./src/page/goods/detail.js",
60 | "goods.cart": "./src/page/goods/cart.js",
61 | "mui.index|mui|plusReady": "./src/page/mui/index.js"
62 | }
63 | ```
64 |
65 | ### 访问页面
66 |
67 | ```js
68 | openWebview({ url: "./goods.cart.html", id: "goods.cart" });
69 | openWebview({ url: "./mui.index.html", id: "mui.index" });
70 | ```
71 |
72 | 这里要注意 2 个细节:
73 |
74 | 1. 后缀一定是`.html`
75 | 2. id 要按照页面的规范,不要出现重复 id
76 |
77 | ### 删除页面
78 |
79 | 如果删除页面了页面,也需要删除`page.json`相应的页面描述代码
80 |
81 | > 实现原理是监听了`page.json`,一旦`page.json`发生改变,会重启`webpack`
82 |
83 | ## 新建组件
84 |
85 | 组件放入`./src/components`目录下,如果组件较多,可自行建立目录.比如 demo 中使用的 Logo 组件可以作为参考.
86 |
87 | ## 新建工具库
88 |
89 | 工具库`./src/utils`主要放一些公用函数,比如请求,打开 webview,支付,分享等执行函数.
90 | demo 中封装了部分来自 mui 的函数比如`自定义事件`,`webview`.这些函数可以作为参考.
91 |
92 | `common.js` 是每个页面都需要加载的一个 js,里面加载了`fastclick`和`vconsole`.如果全局需要加统计,全局执行的函数,可以放在这个文件里面.
93 |
94 | `./src/utils` 做了 `alias`别名,可以 直接这样加载 `import common from "Utils/common"`.
95 |
96 | > utils 是我们会经常修改的, 如果有自己的工具库,请另建文件夹
97 |
98 | ## 请求代理配置 Proxy
99 |
100 | 首先,只有开发的过程中才会有跨域的情况.App 中不存在跨域.
101 |
102 | **为什么会有跨域呢?**
103 |
104 | `MogoH5+`的调试是使用`npm run dev`构建了一个局域网服务器的,比如`http://192.168.199.155:8080/`,这样的好处就是视图修改同步很快,不受 Hbuilder 的限制.
105 |
106 | 起初考虑过`webpack watch`来实现,但是发现`watch`之后的文件变化 HBuilder 无法第一时间反应,也就是说,修改了一个界面,需要等 Hbuilder 发现`文件差异`才会去更新真机的试图.因此才考虑局域网服务器的.
107 |
108 | ### 请求库
109 |
110 | demo 的请求使用的是 `axios`,同样你喜欢什么库都可以自己去封装.
111 |
112 | 常见的请求库有`fetch`,`request`,`SuperAgent`,`jquery-ajax`.
113 |
114 | ### 跨域
115 |
116 | 由于`npm start`后,调试网页是挂在局域网上,并且作为 Hbuilder 的`页面入口`,因此,在请求时会出现`跨域`.
117 |
118 | 在`/config/index.js`中使用本地代理,将下面的`https://api.douban.com`修改成自己使用的业务域名即可.
119 |
120 | ```javascript
121 | proxy: {
122 | "/api": {
123 | name:"DOUBANAPI", // 自己取名
124 | target: "https://api.douban.com",
125 | pathRewrite: { "^/api": "" },
126 | changeOrigin: true,
127 | secure: false
128 | },
129 | "/baidu_api": {
130 | name:"BAIDUAPI", // 自己取名
131 | target: "https://api.baidu.com",
132 | pathRewrite: { "^/baidu_api": "" },
133 | changeOrigin: true,
134 | secure: false
135 | },
136 | ...
137 | }
138 | ```
139 |
140 | 如果有更多业务域名可以继续在`proxy`添加.
141 |
142 | 只有开发的时候才会有跨域问题,打包后的文件网址会被替换成被代理的网址,因此发送请求一定要加上名称`DOUBANAPI`
143 |
144 | ```javascript
145 | request({
146 | url: DOUBANAPI + "/bookList" // 在打包后会变成 https://api.baidu.com/bookList
147 | });
148 | ```
149 |
150 | ## 调试
151 |
152 | ### VConsole
153 |
154 | 在 Hbuilder 中调试会有诸多问题,比如:
155 |
156 | - 不能直接打印`数组`,`对象`,需要转成字符串.
157 | - 即使使用`webview调试`,仍然不能打印出数组,在 mac 上使用也非常不方便.
158 |
159 | 使用`VConsole`,调试的问题基本就脱离 Hbuilder 了,使用`VConsole`主要优点如下
160 |
161 | - 可以打印数组,对象
162 | - 可以查看请求,cookie,Localstorage
163 | - 在`System`栏目中可以看到页面加载速度
164 | - 可以查看元素
165 |
166 | 基本上就是一个简化的`开发者工具栏`,对于调试来说非常简便了.
167 |
168 | ### print 函数
169 |
170 | 由于 `VConsole` 并不能解决全部调试问题,比如页面关闭后调试信息消失,增加一个 `print` 方法,用于在 Hbuilder 上打印对象
171 |
172 | ```js
173 | print(someObjorArray);
174 | ```
175 |
176 | ## 使用 mui
177 |
178 | 1. 首先在`page.json`中给需要使用`mui`的页面加入`|mui`,这一步,`mui`的`js`将会嵌入到改页面当中.
179 |
180 | 2. 使用相对路径加入 mui 的 css,加入方式如下:
181 |
182 | ```html
183 |
186 | ```
187 |
188 | ## 使用 vux/vant
189 |
190 | 系统默认安装了`vux`和`vux-loader`,`vant`也是默认添加的,直接 import 使用即可.
191 |
192 | ```js
193 | import { Group, Calendar, Cell, Badge, CellBox, XButton } from "vux";
194 | ```
195 |
196 | > 如果您不使用 vux,或 vant,可以将其编译器去除来提高您的开发构建效率.[具体方式](qa.html#速度优化方案)
197 |
198 | ## page.json 配置
199 |
200 | 这是一份来自`demo`的页面配置,多页面的主要配置也是来自这里,具体实现细节请参看[多页面的实现]
201 |
202 | ```json
203 | {
204 | "index|plusReady": "./src/main.js",
205 | "goods.detail": "./src/page/goods/detail.js",
206 | "goods.cart": "./src/page/goods/cart.js",
207 | "mui.index|mui|plusReady": "./src/page/mui/index.js",
208 | "user.index": "./src/page/user/index.js",
209 | "vux.index|plusReady": "./src/page/vux/index.js"
210 | }
211 | ```
212 |
213 | 在配置的`键`中发现了`|`符号,`|`后面的值表示页面加载参数,这里主要对一些参数作解释
214 |
215 | | 参数 | 解释 | 备注 |
216 | | ----------- | -------------------------------------------------------------- | -------------- |
217 | | `mui` | 在页面中加载 mui,使用后 mui 会挂在到`window`上 | / |
218 | | `plusReady` | 是否使 plus 提前生效 ,提前生效就可以不用监听 plus 是否已经生效 | 仅在安卓上有效 |
219 |
220 | > 注意:plus 在安卓上提前生效会增加 50-200ms(根据性能)的加载时间,可以通过增加窗口过场动画的时间弥补,或者预加载窗口
221 |
--------------------------------------------------------------------------------
/docs/guide/guide.md:
--------------------------------------------------------------------------------
1 | # 简介
2 |
3 | 
4 |
5 | `MogoH5+` 是一个 vue 多页面**脚手架工具**,结合 H5+可以快速开发安卓与苹果 APP.
6 |
7 | 即使不适用 Hbuilder 打包成 APP,本脚手架同样可以作为多页面网页生成的参考项目.
8 |
9 | ### [APP 演示下载地址](https://fir.im/p52j)
10 |
11 | ## 特性
12 |
13 | - `支持 Npm 生态`
14 | - `支持 vue 语法,以及 vue 生态,比如 mint,vant`
15 | - `支持 ES6/ES7 语法`
16 | - `使用 VConsole 调试`
17 | - `VSCode 友好`
18 | - `局域网便捷调试,不插数据线也可以调试`
19 | - `支持mui`
20 |
21 | # 快速上手
22 |
23 | ## 下载脚手架
24 |
25 | 首先下载脚手架
26 | 脚手架项目地址[MogoH5+](https://github.com/tyaqing/mogo-h5plus)
27 |
28 | ### Git clone
29 |
30 | ```
31 | git clone https://github.com/tyaqing/mogo-h5plus.git
32 | ```
33 |
34 | ### 直接下载
35 |
36 | [下载地址](https://github.com/tyaqing/mogo-h5plus/archive/master.zip)
37 |
38 | 下载后把目录直接导入到 Hbuilder.
39 |
40 | ## 运行脚手架
41 |
42 | ```
43 | // 1 进入项目主目录
44 | cd mogo-h5plus
45 | // 2 安装npm依赖
46 | npm i // 或者 yarn
47 | // 3 调试运行
48 | npm start
49 |
50 | // 运行结果如下
51 | ℹ 「wds」: Project is running at http://192.168.199.155:8080/
52 | ℹ 「wds」: webpack output is served from /
53 | ℹ 「wdm」: Hash: e597725cca065f694fbd
54 | Version: webpack 4.10.2
55 | Time: 4959ms
56 | ```
57 |
58 | 直接下载项目然后根据需求定制打包,最后通过 Hbuilder 云打包即可生成 APP.
59 |
60 | > 本文自带一个案例是使用 VantUI 开发的几个界面,如果你喜欢其他 UI 同样可以替换成其他的 UI.
61 |
62 | ## 真机调试
63 |
64 | 将打印出来的 ip 地址,我们打印出来的是`http://192.168.199.155:8080/`,将这个填入页面入口.
65 |
66 | 
67 |
68 | 然后使用 Hbuilder 基座进行调试测试.
69 |
70 | 
71 |
72 | ## 使用
73 |
74 | 主要怎么使用 MogoH5+做正式的开发,在开发过程中一定要遵守**目录规则**,否则会有意想不到的错误.
75 |
76 | ### 目录结构
77 |
78 | ```
79 | .
80 | ├── assets // 静态资源
81 | ├── docs // 文档
82 | ├── index.html // 入口模板
83 | ├── jsconfig.json //js配置
84 | ├── manifest.json //hbuilder 入口文件
85 | ├── src
86 | │ ├── components //组件文件夹
87 | │ │ └── List.vue //组件
88 | │ ├── index.js //主页入口文件
89 | │ ├── index.vue // 主页vue文件
90 | │ ├── page // 页面
91 | │ └── utils // 工具
92 | ├── unpackage // hbuilder 构建目录
93 | │ └── res
94 | └── webpack.config.js //webpack配置目录
95 | ```
96 |
97 | ### 新建页面
98 |
99 | 假如我们要新建一个名称为`list`的页面作为商品列表,我们就要在`./src/page/goods`下新建`list.js`和`list.vue`两个文件.`list.js`作为多页面的入口,`list.vue`,脚手架自带了几个页面可供参考.
100 |
101 | ::: tip 路由
102 | 遵循相对路径原则,如果在`src`访问这个页面则就是`./goods/list.html`
103 | !!! 后缀一定是`.html`
104 | :::
105 |
106 | ### 新建页面/删除页面[0.3.0]
107 |
108 | 0.3.0 的新建页面和 0.2.0 是兼容的,但是建议您使用 0.3.0 的`page.json`,这样会减少很多因为新建,删除页面产生的错误
109 | 如果您需要更自由的页面结构,比如三级目录.可以按照`page.json`格式添加即可.
110 |
111 | ```json
112 | {
113 | "goods/detail": "./src/page/goods/detail.js",
114 | "map/map": "./src/page/map/map.js",
115 | "mui/index": "./src/page/mui/index.js",
116 | "user/index": "./src/page/user/index.js"
117 | }
118 | ```
119 |
120 | 比如您需要一个添加一个三级级页面,可以按照下面的方法添加,
121 |
122 | ```json
123 | {
124 | ...
125 | "user/index/point": "./src/page/user/point/index.js"
126 | }
127 | ```
128 |
129 | 如果删除页面了页面,也需要删除`page.json`相应的页面描述代码
130 |
131 | > 实现原理是监听了`page.json`,一旦`page.json`发生改变,会重启`webpack`
132 |
133 | ### 新建组件
134 |
135 | 组件放入`./src/components`目录下,如果组件较多,可自行建立目录.比如 demo 中使用的 Logo 组件可以作为参考.
136 |
137 | ### 新建工具库
138 |
139 | 工具库`./src/utils`主要放一些公用函数,比如请求,打开 webview,支付,分享等执行函数.
140 | demo 中封装了部分来自 mui 的函数比如`自定义事件`,`webview`.这些函数可以作为参考.
141 |
142 | ::: tip
143 | `common.js` 是每个页面都需要加载的一个 js,里面加载了`fastclick`和`vconsole`.如果全局需要加统计,全局执行的函数,可以放在这个文件里面.
144 |
145 | `./src/utils` 做了 `alias`别名,可以 直接这样加载 `import common from "Utils/common"`.
146 | :::
147 |
148 | ### 发送请求
149 |
150 | #### 请求库
151 |
152 | demo 的请求使用的是 `axios`,同样你喜欢什么库都可以自己去封装.
153 |
154 | 常见的请求库有`fetch`,`request`,`SuperAgent`,`jquery-ajax`.
155 |
156 | #### 跨域
157 |
158 | 由于`npm start`后,调试网页是挂在局域网上,并且作为 Hbuilder 的`页面入口`,因此,在请求时会出现`跨域`.
159 |
160 | 在`./build.js`中使用本地代理,将下面的`https://api.douban.com`修改成自己使用的业务域名即可.
161 |
162 | ```javascript
163 | proxy: {
164 | "/api": {
165 | name:"DOUBANAPI", // 自己取名
166 | target: "https://api.douban.com",
167 | pathRewrite: { "^/api": "" },
168 | changeOrigin: true,
169 | secure: false
170 | },
171 | "/baidu_api": {
172 | name:"BAIDUAPI", // 自己取名
173 | target: "https://api.baidu.com",
174 | pathRewrite: { "^/api": "" },
175 | changeOrigin: true,
176 | secure: false
177 | },
178 | ...
179 | }
180 | ```
181 |
182 | 如果有更多业务域名可以继续在`proxy`添加.
183 |
184 | ::: tip 注意
185 | 只有开发的时候才会有跨域问题,打包后的文件网址会被替换成被代理的网址,因此发送请求一定要加上名称`DOUBANAPI`
186 |
187 | ```javascript
188 | request({
189 | url: DOUBANAPI + "/bookList"
190 | });
191 | ```
192 |
193 | :::
194 |
195 | ## 调试
196 |
197 | 在 Hbuilder 中调试会有诸多问题,比如:
198 |
199 | - 不能直接打印`数组`,`对象`,需要转成字符串.
200 | - 即使使用`webview调试`,仍然不能打印出数组,在 mac 上使用也非常不方便.
201 |
202 | 使用`VConsole`,调试的问题基本就脱离 Hbuilder 了,使用`VConsole`主要优点如下
203 |
204 | - 可以打印数组,对象
205 | - 可以查看请求,cookie,Localstorage
206 | - 在`System`栏目中可以看到页面加载速度
207 | - 可以查看元素
208 |
209 | 基本上就是一个简化的`开发者工具栏`,对于调试来说非常简便了.
210 |
211 | ## 打包
212 |
213 | ```bash
214 | npm run build
215 | ```
216 |
217 | 运行命令后会有一个`dist`目录,里面的经过压缩的静态文件.
218 |
219 | ### Hbuilder 发行打包
220 |
221 | 在使用 Hbuilder 制作安装包前,请将`入口文件`修改成`dist/index.html`.
222 | 然后可以安心的打包了.
223 |
224 | ## 如何使用 mui
225 |
226 | mui 默认未加载,但是相对应的 js 和 css 放在了 `assets` 目录下.如果需要使用,请按下面步骤操作
227 |
228 | ### 1.去掉加载注释
229 |
230 | 在根目录下去掉下面两段标签的注释
231 |
232 | ```html
233 |
234 |
235 |
236 | ```
237 |
238 | ### 2.使用`npm run build:mui`打包
239 |
240 | > 这个命令会复制`assets`中的文件到打包目录.
241 |
242 | ## 常见问题
243 |
244 | 常见问题一般来说就是白屏问题,或者页面不存在,可能有以下几种情况
245 |
246 | **Q1:删除一些页面后控制台报错**
247 |
248 | 这是由于`HtmlWebpackPlugin`没有找到模板的问题,只需要重新`npm start`即可.
249 |
250 | **Q2:`npm start`控制台报语法错误**
251 |
252 | 请升级你的 node 到最新版本
253 |
254 | **Q3:`npm start`后出现空白页面无法显示**
255 |
256 | 1. 电脑和调试的手机需要在同一个局域网下面
257 | 2. `npm start`后如果局域网 ip 地址有变,请同时在 manifest.json 中修改页面入口
258 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ### 使用案例
4 | | [湖南省运会(ios已上架)](https://fir.im/kncq) | [MogoH5+](https://fir.im/p52j) | [闲时帮](https://itunes.apple.com/cn/app/%E9%97%B2%E6%97%B6%E5%B8%AE-%E4%BE%BF%E6%8D%B7%E7%94%9F%E6%B4%BB-%E5%8F%A3%E8%A2%8B%E6%9C%8D%E5%8A%A1/id1381313264?mt=8) | [闲时帮技术端]( https://itunes.apple.com/cn/app/%E9%97%B2%E6%97%B6%E5%B8%AE-%E6%8A%80%E6%9C%AF%E7%AB%AF/id1381313742?mt=8)|
5 | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |-|-|
6 | |  |  |||
7 |
8 | | [集客坊](https://fir.im/h315) | [安全防护系统](https://fir.im/xqm6) | [蜜诺](https://a.app.qq.com/o/simple.jsp?pkgname=com.meneo.com) |敬请期待 |
9 | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |-|-|
10 | |  |  |||
11 |
12 |
13 |
14 | 
15 |
16 | # MogoH5+ 多页面网页解决脚手架
17 |
18 | 结合 Hbuilder 使用,可以快速开发 WebApp
19 |
20 | - `支持 Npm 生态`
21 | - `支持 vue 语法,以及 vue 生态,比如 vux,mint,vant`
22 | - `支持 ES6/ES7 语法`
23 | - `使用 VConsole 调试`
24 | - `VSCode 友好`
25 | - `局域网便捷调试,不插数据线也可以调试`
26 | - `支持mui的使用`
27 |
28 | ## [文档地址](https://tyaqing.github.io/mogo-h5plus/)
29 |
30 | ### MogoH5+ QQ 交流群 780150310
31 |
32 | ### [Hotfix](https://github.com/tyaqing/hotfix) 让您的Hbuilder APP应用快速拥有更新能力.
33 |
34 | ## 赞助
35 |
36 | 您的赞助会使`MogoH5+`发展的更好.
37 |
38 | | 微信 | 支付宝 |
39 | | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
40 | |
|
|
41 |
42 | ## 更新记录
43 |
44 | ### 2.0.0 [20180813]
45 |
46 | #### [新增]
47 |
48 | 1. `vue`以`commonChunk`的形式加载,多个页面加载同一个`vue`,减少了体积.
49 | 2. `mui`都会已公共文件的形式加载,减少了打包后的体积.
50 | 3. 修改了`webpack`部分配置,减少体积的同时,编译速度提高了很多.
51 | 4. 可以在`config/index.js`中配置是否载入`VConsole`,意味着你可以在`build`环境中使用`VConsole`
52 | 5. 加入`h5plus-hotfix`模块,启用应用的热更新
53 |
54 | #### [修改]
55 |
56 | 1. 移除了内置热更新,热更新以新项目`hotfix`单独维护
57 | 2. 修复了购物车侧滑可以直接返回
58 | 3. 删除了mui演示页中`import`加载的`mui.css`
59 | 4. 将模板`index.html`部分js转移到`common.js`
60 | 5. 解决ios假死的问题,修改了`fastclick`的npm源
61 |
62 | #### [升级指南]
63 |
64 | 1. 使用mui的开发者需要删除掉 vue页面中加载的`mui.css`,只要在`page.json`使用了`|mui`,脚手架已经自动加载了mui的css和js
65 | 2. 修改过index.html的开发者,需要注意内容变化做适应修改
66 |
67 | ### 1.3.0 [20180727]
68 |
69 | #### [新增]
70 |
71 | 1. 增加`热更新/迭代`集成,具体文档查看[热更新/迭代](../practice/hotfix.md)
72 | 2. 增加自定义返回实现,返回按钮可以[自定义返回按钮事件](./qa.html#自定义返回按钮事件)
73 | 3. 增加"商品加入购物车"功能实例演示页面间通讯
74 | 4. 新增 VConsole 以 webpack 插件的形式加载,`run build`会自动去掉
75 |
76 | #### [修复]
77 |
78 | 1. 修复了超多页面下调试慢的问题,使用`html-webpack-plugin-for-multihtml`解决
79 | 2. 修改了版本文档
80 |
81 | #### [升级指导]
82 |
83 | 1. 将 VConsole 在 common.js 中删掉,因为已经以 webpack 插件形式加载
84 | 2. `utils` 是我们会经常修改的, 如果有自己的工具库,请另建文件夹
85 |
86 | ### 1.2.0 [20180719]
87 |
88 | #### [新增]
89 |
90 | - 增加预加载窗口打开方式,根据不同场景使用不同的打开方式,可以大大提高 webview 的打开速度,首页已加入使用案例
91 | - 由于 VConsole 并不能解决全部调试问题,增加一个`print`方法,用于在 Hbuilder 上打印对象
92 |
93 | #### [速度优化方案]
94 |
95 | 最近许多反映脚手架很慢的可以参考一下优化方案,可以大大提高调试/打包速度.
96 |
97 | 1.2 的版本中移除了一些不必要的插件,应该会快那么一点吧.追求速度的继续往下看.
98 |
99 | 由于 demo 需要展示各种 ui,加载了各种的 ui 的 loader,所以如果开发者用不到可以将其移除.
100 |
101 | ##### 1.如果不使用 VUX
102 |
103 | 注释掉 `vux-loader` 即可,在`webpack.base.conf.js`中,修改以下代码
104 |
105 | ```
106 | const vuxLoader = require("vux-loader");
107 |
108 | module.exports = vuxLoader.merge(webpackConfig, {
109 | plugins: ["vux-ui"]
110 | });
111 | ```
112 |
113 | 修改后
114 |
115 | ```
116 | module.exports = webpackConfig;
117 | ```
118 |
119 | ##### 2.如果不使用 vant
120 |
121 | 移除掉`.babalrc`中以下代码
122 |
123 | ```
124 | [
125 | "import",
126 | {
127 | "libraryName": "vant",
128 | "libraryDirectory": "es",
129 | "style": true
130 | }
131 | ]
132 | ```
133 |
134 | ##### 3.优化建议
135 |
136 | 对于一些简单的页面其实可以不用 ui 框架,加载的时候会很快
137 | 使用 ui 框架大概也只会增加 100-200ms 的 js 运行时间,窗口过渡 200ms 的话,基本上不会影响用户体验
138 | 如果使用大量组件,增加的时间可能会比较大,这个时候可以考虑预加载这个窗口了.
139 |
140 | 参考:http://ask.dcloud.net.cn/article/25
141 |
142 | #### [升级方案]
143 |
144 | 几乎每个版本都是兼容的,所以只要将`src`中的文件转移到新版本就 ok 啦!
145 |
146 | #### [终极解决:webpack4]
147 |
148 | 由于官方的 `webpack3` 脚手架速度也提升不了多少了,所以 `1.2` 之后的 `1.x` 版本之后可能几乎不会对脚手架做修改了,只会增加很多实用的使用案例和工具方法
149 |
150 | 不过现在已经开始对 `webpack4` 开始研究了 webpack4 `2.0`版本见啦
151 |
152 | ### 1.1.0 [20180706]
153 |
154 | #### [新增]
155 |
156 | - `page.json`可以配置是否加载 mui 或者是否使用 plusready
157 | - 增加`fire`页面传值函数,详情可见商品详情页和首页的自定义事件
158 |
159 | #### [修复]
160 |
161 | - 修复了资源路径加载问题(需修改`page.json`配置)
162 | - 修复了 mui 加载不灵活的问题,减少打包的体积
163 | - 修复了 mui 字体文件加载失败的问题
164 |
165 | #### 1.0.x 到 1.1.x
166 |
167 | 由于之前资源路径的问题,目前的解决方案是修改`page.json`的配置,将原来的以路径作为键`mui/index`写成`mui.index`即可,如下
168 |
169 | 如果要使用 mui 就加入 `|mui`, 如果要使用 mui 就加入 `|plusReady`,不用则不加.
170 |
171 | > plusReady 在安卓手机上提前载入可能会影响页面打开速度,解决方法有两种:1 不提前使 plus 生效 2.预加载 plus
172 |
173 | ```json
174 | {
175 | "mui.index|mui|plusReady": "./src/page/mui/index.js"
176 | }
177 | ```
178 |
179 | #### 注意事项
180 |
181 | 请在`created`生命周期里面接收事件,否则会因为视图刷新多次执行.
182 |
183 | ### 1.0.1 [20180704]
184 |
185 | - 修复了 background 图片路径打包后不正确的问题
186 |
187 | ### 1.0.0 [20180630]
188 |
189 | - 使用 vue 官方脚手架作为基层,健壮性得到`史诗级`提升
190 | - 添加了 vux 的支持
191 | - 修改的 mui 的加载方式
192 | - 配置方面有部分变化,详情请看文档
193 | - 升级了安卓 app
194 |
195 | ### 0.3.0 [20180628]
196 |
197 | - 解决了因为新增/删除页面导致的 webpack 错误
198 | - 添加了 openWebview 的 extras 参数
199 |
200 | ### 0.2.0 [20180623]
201 |
202 | - 添加了对 mui 样式和 js 的支持
203 |
204 | ## 部分截图
205 |
206 |
207 |
208 |
209 |
210 |
211 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | 下拉Ajax请求试试😋
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | 标签
48 | 标签
49 | 标签
50 | 标签
51 |
52 |
53 |
54 |
271 |
272 |
281 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "@platforms": ["android", "iPhone"],
3 | "id": "com.femirror.mogoh5" /*应用的标识,创建应用时自动生成,勿手动修改*/,
4 | "name": "MogoH5+" /*应用名称,程序桌面图标名称*/,
5 | "version": {
6 | "name": "1.6.0" /*应用版本名称*/,
7 | "code": "141"
8 | },
9 | "description": "MogoH5+" /*应用描述信息*/,
10 | "icons": {
11 | "72": "icon.png"
12 | },
13 | "launch_path":
14 | "dist/index.html" /*应用的入口页面,默认为根目录下的index.html;支持网络地址,必须以http://或https://开头*/,
15 | "developer": {
16 | "name": "" /*开发者名称*/,
17 | "email": "" /*开发者邮箱地址*/,
18 | "url": "" /*开发者个人主页地址*/
19 | },
20 | "permissions": {
21 | "Cache": {
22 | "description": "管理应用缓存"
23 | },
24 | "Console": {
25 | "description": "跟踪调试输出日志"
26 | },
27 | "Contacts": {
28 | "description": "访问系统联系人信息"
29 | },
30 | "Events": {
31 | "description": "应用扩展事件"
32 | }
33 | },
34 | "plus": {
35 | "statusbar": {
36 | "immersed": true,
37 | "style": "dark"
38 | },
39 | "splashscreen": {
40 | "autoclose": true /*是否自动关闭程序启动界面,true表示应用加载应用入口页面后自动关闭;false则需调plus.navigator.closeSplashscreen()关闭*/,
41 | "waiting": true /*是否在程序启动界面显示等待雪花,true表示显示,false表示不显示。*/
42 | },
43 | "popGesture":
44 | "close" /*设置应用默认侧滑返回关闭Webview窗口,"none"为无侧滑返回功能,"hide"为侧滑隐藏Webview窗口。参考http://ask.dcloud.net.cn/article/102*/,
45 | "runmode":
46 | "normal" /*应用的首次启动运行模式,可取liberate或normal,liberate模式在第一次启动时将解压应用资源(Android平台File API才可正常访问_www目录)*/,
47 | "signature":
48 | "Sk9JTiBVUyBtYWlsdG86aHIyMDEzQGRjbG91ZC5pbw==" /*可选,保留给应用签名,暂不使用*/,
49 | "distribute": {
50 | "plugins": { "maps": {} },
51 | "apple": {
52 | "appid":
53 | "" /*iOS应用标识,苹果开发网站申请的appid,如io.dcloud.HelloH5*/,
54 | "mobileprovision": "" /*iOS应用打包配置文件*/,
55 | "password": "" /*iOS应用打包个人证书导入密码*/,
56 | "p12": "" /*iOS应用打包个人证书,打包配置文件关联的个人证书*/,
57 | "devices":
58 | "universal" /*iOS应用支持的设备类型,可取值iphone/ipad/universal*/,
59 | "frameworks": [] /*调用Native.js调用原生Objective-c API需要引用的FrameWork,如需调用GameCenter,则添加"GameKit.framework"*/
60 | },
61 | "google": {
62 | "packagename": "" /*Android应用包名,如io.dcloud.HelloH5*/,
63 | "keystore": "" /*Android应用打包使用的密钥库文件*/,
64 | "password": "" /*Android应用打包使用密钥库中证书的密码*/,
65 | "aliasname": "" /*Android应用打包使用密钥库中证书的别名*/,
66 | "permissions": ["","","","",""]
67 | /*使用Native.js调用原生安卓API需要使用到的系统权限*/
68 | },
69 | "orientation": ["portrait-primary","landscape-secondary"] /*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/,
70 | "icons": {
71 | "ios": {
72 | "prerendered": true /*应用图标是否已经高亮处理,在iOS6及以下设备上有效*/,
73 | /*应用图标,分辨率:512x512,用于自动生成各种尺寸程序图标*/
74 | "iphone": {
75 | "normal": "" /*iPhone3/3GS程序图标,分辨率:57x57*/,
76 | "retina": "" /*iPhone4程序图标,分辨率:114x114*/,
77 | /*iPhone4S/5/6程序图标,分辨率:120x120*/
78 | /*iPhone6 Plus程序图标,分辨率:180x180*/
79 | "spotlight-normal":
80 | "" /*iPhone3/3GS Spotlight搜索程序图标,分辨率:29x29*/,
81 | "spotlight-retina":
82 | "" /*iPhone4 Spotlight搜索程序图标,分辨率:58x58*/,
83 | /*iPhone4S/5/6 Spotlight搜索程序图标,分辨率:80x80*/
84 | "settings-normal": "" /*iPhone4设置页面程序图标,分辨率:29x29*/,
85 | /*iPhone4S/5/6设置页面程序图标,分辨率:58x58*/
86 | "app@2x": "unpackage/res/icons/120x120.png",
87 | "app@3x": "unpackage/res/icons/180x180.png",
88 | "settings@3x": "unpackage/res/icons/87x87.png",
89 | "settings@2x": "unpackage/res/icons/58x58.png",
90 | "spotlight@2x": "unpackage/res/icons/80x80.png",
91 | "spotlight@3x": "unpackage/res/icons/120x120.png",
92 | "notification@3x": "unpackage/res/icons/60x60.png",
93 | "notification@2x":
94 | "unpackage/res/icons/40x40.png" /*iPhone6Plus设置页面程序图标,分辨率:87x87*/
95 | },
96 | "ipad": {
97 | "normal": "" /*iPad普通屏幕程序图标,分辨率:72x72*/,
98 | "retina": "" /*iPad高分屏程序图标,分辨率:144x144*/,
99 | /*iPad iOS7程序图标,分辨率:76x76*/
100 | /*iPad iOS7高分屏程序图标,分辨率:152x152*/
101 | "spotlight-normal":
102 | "" /*iPad Spotlight搜索程序图标,分辨率:50x50*/,
103 | "spotlight-retina":
104 | "" /*iPad高分屏Spotlight搜索程序图标,分辨率:100x100*/,
105 | /*iPad iOS7 Spotlight搜索程序图标,分辨率:40x40*/
106 | /*iPad iOS7高分屏Spotlight搜索程序图标,分辨率:80x80*/
107 | /*iPad设置页面程序图标,分辨率:29x29*/
108 | "app": "unpackage/res/icons/76x76.png",
109 | "app@2x": "unpackage/res/icons/152x152.png",
110 | "settings": "unpackage/res/icons/29x29.png",
111 | "proapp@2x": "unpackage/res/icons/167x167.png",
112 | "spotlight": "unpackage/res/icons/40x40.png",
113 | "settings@2x": "unpackage/res/icons/58x58.png",
114 | "spotlight@2x": "unpackage/res/icons/80x80.png",
115 | "notification": "unpackage/res/icons/20x20.png",
116 | "notification@2x":
117 | "unpackage/res/icons/40x40.png" /*iPad高分屏设置页面程序图标,分辨率:58x58*/
118 | },
119 | "appstore": "unpackage/res/icons/1024x1024.png"
120 | },
121 | "android": {
122 | "mdpi":
123 | "unpackage/res/icons/48x48.png" /*普通屏程序图标,分辨率:48x48*/,
124 | "ldpi":
125 | "unpackage/res/icons/48x48.png" /*大屏程序图标,分辨率:48x48*/,
126 | "hdpi":
127 | "unpackage/res/icons/72x72.png" /*高分屏程序图标,分辨率:72x72*/,
128 | "xhdpi":
129 | "unpackage/res/icons/96x96.png" /*720P高分屏程序图标,分辨率:96x96*/,
130 | "xxhdpi": "unpackage/res/icons/144x144.png",
131 | "xxxhdpi":
132 | "unpackage/res/icons/192x192.png" /*1080P 高分屏程序图标,分辨率:144x144*/
133 | }
134 | },
135 | "splashscreen": {
136 | "ios": {
137 | "iphone": {
138 | "default": "" /*iPhone3启动图片选,分辨率:320x480*/,
139 | "retina35": "" /*3.5英寸设备(iPhone4)启动图片,分辨率:640x960*/,
140 | "retina40":
141 | "" /*4.0 英寸设备(iPhone5/iPhone5s)启动图片,分辨率:640x1136*/,
142 | "retina47": "" /*4.7 英寸设备(iPhone6)启动图片,分辨率:750x1334*/,
143 | "retina55":
144 | "" /*5.5 英寸设备(iPhone6 Plus)启动图片,分辨率:1242x2208*/,
145 | "retina55l":
146 | "" /*5.5 英寸设备(iPhone6 Plus)横屏启动图片,分辨率:2208x1242*/
147 | },
148 | "ipad": {
149 | "portrait": "" /*iPad竖屏启动图片,分辨率:768x1004*/,
150 | "portrait-retina": "" /*iPad高分屏竖屏图片,分辨率:1536x2008*/,
151 | "landscape": "" /*iPad横屏启动图片,分辨率:1024x748*/,
152 | "landscape-retina":
153 | "" /*iPad高分屏横屏启动图片,分辨率:2048x1496*/,
154 | "portrait7": "" /*iPad iOS7竖屏启动图片,分辨率:768x1024*/,
155 | "portrait-retina7":
156 | "" /*iPad iOS7高分屏竖屏图片,分辨率:1536x2048*/,
157 | "landscape7": "" /*iPad iOS7横屏启动图片,分辨率:1024x768*/,
158 | "landscape-retina7":
159 | "" /*iPad iOS7高分屏横屏启动图片,分辨率:2048x1536*/
160 | }
161 | },
162 | "android": {
163 | "mdpi": "" /*普通屏启动图片,分辨率:240x282*/,
164 | "ldpi": "" /*大屏启动图片,分辨率:320x442*/,
165 | "hdpi": "" /*高分屏启动图片,分辨率:480x762*/,
166 | "xhdpi": "" /*720P高分屏启动图片,分辨率:720x1242*/,
167 | "xxhdpi": "" /*1080P高分屏启动图片,分辨率:1080x1882*/
168 | }
169 | }
170 | }
171 | },
172 | "dependencies": {
173 | "idle": {
174 | "resources": [
175 | "src/assets/fonts/mui.ttf",
176 | "test/unit/specs/HelloWorld.spec.js",
177 | "src/page/goods/detail.js",
178 | "dist/goods/detail.html",
179 | "src/utils/webview.js",
180 | "dist/assets/css/mui/index.56e5f56fc0bd813623b07c32aedb0e8c.css",
181 | "src/assets/fonts/mui-icons-extra.ttf",
182 | "src/assets/mui/mui.min.js",
183 | "dist/map/map.js",
184 | "dist/assets/img/logo.adf2bc3.png",
185 | "build/mui-loader.js",
186 | "package.json",
187 | "src/page/mui/index.js",
188 | "build/check-versions.js",
189 | "config/dev.env.js",
190 | "package-lock.json",
191 | "README.md",
192 | "test/unit/jest.conf.js",
193 | "src/page.json",
194 | "docs/README.md",
195 | "build/webpack.dev.conf.js",
196 | "src/page/map/map.vue",
197 | "index.html",
198 | "test/unit/setup.js",
199 | "src/utils/envent.js",
200 | "src/assets/mui/mui.css",
201 | "src/assets/logo.png",
202 | "build/multipage.js",
203 | "config/test.env.js",
204 | "dist/assets/css/map/map.2d75f521352cb21662b356ac39e8c9ce.css",
205 | "src/main.js",
206 | "src/page/map/map.js",
207 | "src/components/content.vue",
208 | "dist/map/map.html",
209 | "dist/app.js",
210 | "config/index.js",
211 | "src/utils/request.js",
212 | "src/utils/common.js",
213 | "src/page/user/index.vue",
214 | "src/components/HelloWorld.vue",
215 | "dist/vux/index.js",
216 | "dist/vux/index.html",
217 | "dist/assets/css/user/index.67f3ac9443309c4cdb0fbfa855200001.css",
218 | "build/utils.js",
219 | "dist/mui/index.html",
220 | "dist/assets/fonts/mui.8820b7f.ttf",
221 | "build/logo.png",
222 | "src/page/goods/detail.vue",
223 | "build/vue-loader.conf.js",
224 | "dist/mui/index.js",
225 | "src/page/vux/index.vue",
226 | "docs/deploy.sh",
227 | "build/build.js",
228 | "src/App.vue",
229 | "config/prod.env.js",
230 | "dist/user/index.js",
231 | "build/webpack.base.conf.js",
232 | "dist/assets/css/goods/detail.99776475e779987e734405cbb06f0dcd.css",
233 | "src/page/user/index.js",
234 | "dist/assets/css/app.e4cc5007c4501d913a3ad4364b16bf23.css",
235 | "dist/goods/detail.js",
236 | "src/components/logo.vue",
237 | "src/page/vux/index.js",
238 | "src/page/mui/index.vue",
239 | "docs/guide.md",
240 | "build/webpack.prod.conf.js",
241 | "dist/assets/css/vux/index.e04574f3b1ee9b1e211545fbaea0a4b4.css"
242 | ]
243 | },
244 | "pages": {
245 | "dist/index.html": {
246 | "resources": [],
247 | "refer": [
248 | "dist/user/index.html",
249 | "dist/goods.detail.html",
250 | "dist/mui.index.html",
251 | "dist/vux.index.html",
252 | "dist/goods.cart.html"
253 | ],
254 | "priority": 0
255 | },
256 | "dist/vux.index.html": {
257 | "resources": [
258 | "dist/assets/css/vux.index.css"
259 | ],
260 | "refer": [],
261 | "priority": 0
262 | }
263 | }
264 | },
265 | "unpackage": [
266 | "src/page/user/index.js",
267 | "src/page/user/index.vue",
268 | "index.html",
269 | "package-lock.json",
270 | "package.json",
271 | "build/build.js",
272 | "build/check-versions.js",
273 | "build/logo.png",
274 | "build/mui-loader.js",
275 | "build/multipage.js",
276 | "build/utils.js",
277 | "build/vue-loader.conf.js",
278 | "build/webpack.base.conf.js",
279 | "build/webpack.dev.conf.js",
280 | "build/webpack.prod.conf.js",
281 | "config/dev.env.js",
282 | "config/index.js",
283 | "config/prod.env.js",
284 | "config/test.env.js",
285 | "docs/README.md",
286 | "docs/deploy.sh",
287 | "docs/guide.md",
288 | "src/assets/fonts/mui-icons-extra.ttf",
289 | "src/assets/fonts/mui.ttf",
290 | "src/assets/logo.png",
291 | "src/assets/mui/mui.css",
292 | "src/assets/mui/mui.min.js",
293 | "src/components/HelloWorld.vue",
294 | "src/components/content.vue",
295 | "src/components/logo.vue",
296 | "src/page/goods/detail.js",
297 | "src/page/goods/detail.vue",
298 | "src/page/map/map.js",
299 | "src/page/map/map.vue",
300 | "src/page/mui/index.js",
301 | "src/page/mui/index.vue",
302 | "src/page/vux/index.js",
303 | "src/page/vux/index.vue",
304 | "src/utils/common.js",
305 | "src/utils/envent.js",
306 | "src/utils/request.js",
307 | "src/utils/webview.js",
308 | "src/App.vue",
309 | "src/main.js",
310 | "src/page.json",
311 | "test/unit/jest.conf.js",
312 | "test/unit/setup.js",
313 | "test/unit/specs/HelloWorld.spec.js",
314 | "README.md"
315 | ]
316 | }
317 |
--------------------------------------------------------------------------------