# [Tutorial](https://medium.com/sicara/a-progressive-web-application-with-vue-js-webpack-material-design-part-1-c243e2e6e402) vue pwa * Vue PWA template is built on top of Vue webpack template * Webpack is a modern and powerful module bundler for Javascript application * Project layout * build: webpack and vue-loader configuration files * config: app config (environments, parameters) * src: application source code * statis: images, css & other public assets * test: unit test files (Karma & Mocha) ```sh $ npm install -g vue-cli // use pwa template to scaffold a project $ vue init pwa cropchat $ cd cropchat $ npm install $ npm run dev // launch browser at http://localhost:8080 ``` * Vue pwa template provide default `static/manifest.json`. Edit it to customize the project ```json { "name": "cropchat", "short_name": "cropchat", "icons": [ { "src": "/static/img/icons/cropchat-icon-64x64.png", "sizes": "192x192", "type": "image/png" }, { "src": "/static/img/icons/cropchat-icon-128x128.png", "sizes": "128x128", "type": "image/png" }, { "src": "/static/img/icons/cropchat-icon-256x256.png", "sizes": "256x256", "type": "image/png" }, { "src": "/static/img/icons/cropchat-icon-512x512.png", "sizes": "512x512", "type": "image/png" } ], "start_url": "/", "display": "fullscreen", "orientation": "portrait", "background_color": "#2196f3", "theme_color": "#2196f3" } ``` * `index.html` already provide the manifest link ```html ... ... ``` ## Access from mobile * use `ngrok` to forward internet address to localhost host ```sh $ npm install -g ngrok $ ngrok http 8080 ``` ```text ngrok by @inconshreveable (Ctrl+C to quit) Session Status online Version 2.1.18 Region United States (us) Web Interface http://127.0.0.1:4040 Forwarding http://5ef29506.ngrok.io -> localhost:8080 Forwarding https://5ef29506.ngrok.io -> localhost:8080 Connections ttl opn rt1 rt5 p50 p90 39 3 0.01 0.01 120.01 881.89 ``` * Access `https://5ef29506.ngrok.io` from mobile ## Develop Vue [App](https://medium.com/sicara/a-progressive-web-application-with-vue-js-webpack-material-design-part-1-c243e2e6e402) * `src/components/HomeView.vue` ```vue ``` * `src/components/DetailView.vue` ```vue ``` * `src/components/PostView.vue` ```vue ``` * Update `src/router/index.js` ```js import Vue from 'vue' import Router from 'vue-router' import HomeView from '@/components/HomeView' import DetailView from '@/components/DetailView' import PostView from '@/components/PostView' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'home', component: HomeView }, { path: '/detail/:id', name: 'detail', component: DetailView }, { path: '/post', name: 'post', component: PostView } ] }) ``` * Remove `Hello.vue` ### Layout Design * install material Design ```sh $ npm install material-design-lite --save ``` * Update `src/App.vue` ```vue ``` * Add Navigation Bar. Update `src/App.vue` template ```vue ``` * Hide burger menu upon click menu link ```vue ``` * Populate views * Create `src/data.js` ```js export default { pictures: [ { 'id': 0, 'url': 'https://25.media.tumblr.com/tumblr_m40h4ksiUa1qbyxr0o1_400.gif', 'comment': 'A cat game', 'info': 'Posted by Kevin on Friday' }, { 'id': 1, 'url': 'https://25.media.tumblr.com/tumblr_lhd7n9Qec01qgnva2o1_500.jpg', 'comment': 'Tatoo & cat', 'info': 'Posted by Charles on Tuesday' }, { 'id': 2, 'url': 'https://24.media.tumblr.com/tumblr_m4j2atctRm1qejbiro1_1280.jpg', 'comment': 'Santa cat', 'info': 'Posted by Richard on Monday' }, { 'id': 3, 'url': 'https://25.media.tumblr.com/tumblr_m3rmbwhVB51qhwmnpo1_1280.jpg', 'comment': 'Mexico cat', 'info': 'Posted by Richard on Monday' }, { 'id': 4, 'url': 'https://24.media.tumblr.com/tumblr_mceknxs4Lo1qd477zo1_500.jpg', 'comment': 'Curious cat', 'info': 'Posted by Richard on Monday' } ] } ``` * Update `src/components/HomeView.vue` to display mocked data ```vue ``` * Update temple ans style ```vue ... ```