├── 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 | 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 | | foo | foo | 14 | -------------------------------------------------------------------------------- /src/components/logo.vue: -------------------------------------------------------------------------------- 1 | 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 | foo 10 | 11 | ## [访问网站](https://hotfix.femirror.com/) 12 | 13 | ## 使用指南 14 | 15 | ### 注册 16 | 17 | 使用`Github`授权登录. 18 | 19 | ### 操作步骤 20 | 21 |
22 | 23 | foo 24 | 25 |

26 | foo 27 | 28 |

29 | foo 30 | 31 |

32 | foo 33 |

34 | 35 | foo 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 | foo 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 | foo 24 | 25 | ### wgt 热更新的发布 26 | 27 | 点击`发布`按钮,如下图,提供几种参数供您选择. 28 | 29 | foo 30 | #### 更新方式的选择 31 | 32 | 1. 静默更新 : 使用`checkUpdate`方法后检查更新,如果有更新会自动下载 app,整个过程没有任何提示,用户第二次打开 app 就会出现更新后的效果. 33 | 2. 提示更新 : 使用`checkUpdate`方法后检查更新,如果有则会弹出确认框,用户确认后会提示正在下载,正在安装,安装完成重启,更新完成等提示. 34 | 35 | #### 更新平台的选择 36 | 37 | 如果只需要某一个平台更新,可以根据需求选择 38 | 39 | | iphone 效果如下 | 安卓效果如下 | 40 | | ---------------------------------------------------------------- | --------------------------------------------------------------------- | 41 | | foo | foo | 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 | ![GitHub tag](https://img.shields.io/github/tag/tyaqing/mogo-h5plus.svg) 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 | | foo | foo | 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 | 30 | 31 | 43 | 44 | 66 | -------------------------------------------------------------------------------- /src/page/mui/index.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 59 | 60 | 62 | -------------------------------------------------------------------------------- /docs/hotfix/old/introduction.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | > `Hotfix`+`FEmirror 云更新` 让您的 H5+应用快速拥有热更新功能. 4 | 5 | 只需`几分钟`,让您的应用拥有更新能力! 6 | 7 | | iphone 热更新 效果如下 | 安卓热更新效果如下 | 安卓安装更新如下 | 8 | | ---------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------- | 9 | | foo | foo | foo | 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 | | foo | foo | 71 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 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 | ![GitHub tag](https://img.shields.io/github/tag/tyaqing/mogo-h5plus.svg) 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 | 27 | 28 | 127 | 128 | -------------------------------------------------------------------------------- /src/page/vux/index.vue: -------------------------------------------------------------------------------- 1 | 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 | | foo | foo | foo | 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 | 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 | ![](https://user-gold-cdn.xitu.io/2018/6/12/163f19299efa1d44?w=606&h=244&f=png&s=25160) 47 | 48 | 然后使用 Hbuilder 基座进行调试测试. 49 | 50 | ![](https://user-gold-cdn.xitu.io/2018/6/12/163f1938c91c9e1d?w=687&h=112&f=png&s=72460) 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 | ![GitHub tag](https://img.shields.io/github/tag/tyaqing/mogo-h5plus.svg) 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 | ![](https://user-gold-cdn.xitu.io/2018/6/12/163f19299efa1d44?w=606&h=244&f=png&s=25160) 67 | 68 | 然后使用 Hbuilder 基座进行调试测试. 69 | 70 | ![](https://user-gold-cdn.xitu.io/2018/6/12/163f1938c91c9e1d?w=687&h=112&f=png&s=72460) 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 | | ![](https://oivkbuqoc.qnssl.com/6e664136b1e2cf70bdf41488c32caeaa84a4ba40?tmp=1531547639.7200313) | ![](https://oivkbuqoc.qnssl.com/1facce4f4a56f49670c6f010aef07f193334286d?tmp=1531547639.7208393) |![](https://oivkbuqoc.qnssl.com/5bd3db37eadfd18828a423f536d6d5b74f348c70?attname=blob&tmp=1554385208.77909)|![](https://oivkbuqoc.qnssl.com/e174ae74abdec75bd96e37a554aa50bc12db9e38?attname=blob&tmp=1554385208.77874)| 7 | 8 | | [集客坊](https://fir.im/h315) | [安全防护系统](https://fir.im/xqm6) | [蜜诺](https://a.app.qq.com/o/simple.jsp?pkgname=com.meneo.com) |敬请期待 | 9 | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |-|-| 10 | | ![](https://oivkbuqoc.qnssl.com/6372e21930942ece61b5f24a48e87e7ab0e45c70?attname=blob&tmp=1554385208.7800162) | ![](https://oivkbuqoc.qnssl.com/52480f530ebf8e36e9491682069bd64742f63586?attname=blob&tmp=1554385208.780548) |![](https://pp.myapp.com/ma_icon/0/icon_52854708_1553753611/96)|| 11 | 12 | 13 | 14 | ![GitHub tag](https://img.shields.io/github/tag/tyaqing/mogo-h5plus.svg) 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 | | foo | foo | 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 | 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 | --------------------------------------------------------------------------------