npm install easywebpack-cli -g
命令行,而後就可使用 easywebpack
或 easy
命令easywebpack init
npm install
git clone https://github.com/hubcarl/egg-vue-webpack-boilerplate.git npm install
初始化的項目提供多頁面和SPA(vue-router/axios)服務端渲染實例,能夠直接運行。javascript
npm start
npm start 作了以下三件事情css
npm run build 或 easywebpack build prod
app/view
目錄public
目錄buildConfig.json
和 manifest.json
放到 config
目錄啓動應用前, 請設置 EGG_SERVER_ENV
環境變量,測試環境設置 test
, 正式環境設置 prod
html
npm start
easywebpack-cli
統一構建,支持 dev,test,prod 模式構建easywebpack-cli
經過項目根目錄下的 webpack.config.js
配置文件構造出 Webpack 實際的配置文件,配置項請見 webpack.config.js webpackConfigList.length
啓動對應個數的 Webpack 編譯實例,這裏會同時啓動兩個 Webpack 構建服務, 客戶端jsbundle構建,端口9000, 服務端jsbundle構建端口9001。默認端口爲9000, 端口依次遞增。// config/config.local.js 本地 npm start 使用 const EasyWebpack = require('easywebpack-vue'); exports.webpack = { webpackConfigList:EasyWebpack.getWebpackConfig() };
app/web/page
目錄中全部 .vue 文件看成 Webpack 構建入口是採用 app/web/framework/vue/entry 的 client-loader.js 和 server-loader.js 模板實現的,這個須要結合 webpack.config.js
下的 entry.loader 使用。entry: { include: ['app/web/page', { 'app/app': 'app/web/page/app/app.js?loader=false' }], exclude: ['app/web/page/[a-z]+/component', 'app/web/page/app'], loader: { // 若是沒有配置loader模板,默認使用 .js 文件做爲構建入口 client: 'app/web/framework/vue/entry/client-loader.js', server: 'app/web/framework/vue/entry/server-loader.js', } }
上面 { 'app/app': 'app/web/page/app/app.js?loader=false' }
這個 loader=false
的含義表示 app/web/page
目錄下的 app/app.js
不使用 entry.loader 模板。由於這個app/app.js是一個SPA服務端渲染Example,實現邏輯與其餘普通的頁面不同,不能用 entry.loader 模板, 這個功能在自定義entry文件構建規範時使用。前端
webpack.config.js
entry.exclude 排除 vue文件。
支持多頁面/單頁面服務端渲染, 前端渲染, 靜態頁面三種方式.vue
在app/web/page 目錄下面建立home目錄, home.vue 文件, Webpack自動根據.vue文件建立entry入口, 具體實現請見webpack.config.jsjava
<template> <layout title="基於egg-vue-webpack-dev和egg-view-vue插件的工程示例項目" description="vue server side render" keywords="egg, vue, webpack, server side render"> {{message}} </layout> </template> <style> @import "home.css"; </style> <script type="text/babel"> export default { components: { }, computed: { }, methods: { }, mounted() { } } </script>
egg-view-vue-ssr
插件 render
方法實現exports.index = function* (ctx) { yield ctx.render('home/home.js', { message: 'vue server side render!' }); };
app.get('/home', app.controller.home.home.index);
egg-view-vue-ssr
插件 renderClient
方法實現exports.client = function* (ctx) { yield ctx.renderClient('home/home.js', { message: 'vue server side render!' }); };
app.get('/client', app.controller.home.home.client);
webpack.config.js
配置和 app/web/page/html
代碼實現egg-static
靜態文件訪問HTML文件在app/web/page 目錄下面建立app目錄, app.vue, app.js 文件.webpack
<template> <app-layout> <transition name="fade" mode="out-in"> <router-view></router-view> </transition> </app-layout> </template> <style lang="sass"> </style> <script type="text/babel"> export default { computed: { }, mounted(){ } } </script>
import { sync } from 'vuex-router-sync'; import store from 'store/app'; import router from 'component/app/router'; import app from './app.vue'; import App from 'app'; import Layout from 'component/layout/app'; App.component(Layout.name, Layout); sync(store, router); export default App.init({ base: '/app', ...app, router, store });
exports.index = function* (ctx) { yield ctx.render('app/app.js', { url: this.url.replace(/\/app/, '') }); };
app.get('/app(/.+)?', app.controller.app.app.index);
EGG_SERVER_ENV=prod
環境變量, 更多請見運行環境 app/view
目錄, public
目錄以及 buildConfig.json
和 manifest.json
等文件, 都是 gitignore
的,部署時請注意把這些文件打包進去。