如何搭建一個基於 Egg + Webpack + Vue 的服務端渲染工程項目呢?
項目你能夠經過 easywebpack-cli 直接初始化便可完成或者clone egg-vue-webpack-boilerplate。下面說明一下從零如何搭建一個Egg + Webpack + Vue 的服務端渲染工程項目。javascript
egg-init egg-vue-ssr // choose Simple egg app
npm i easywebpack-vue --save-dev npm i egg-webpack --save-dev
npm i egg-view-vue --save npm i egg-view-vue-ssr --save
在 ${app_root}/config/plugin.local.js 添加以下配置css
exports.webpack = { enable: true, package: 'egg-webpack' }; exports.webpackvue = { enable: true, package: 'egg-webpack-vue' };
const EasyWebpack = require('easywebpack-vue'); // 用於本地開發時,讀取 Webpack 配置,而後構建 exports.webpack = { webpackConfigList: EasyWebpack.getWebpackConfig() };
'use strict'; const path = require('path'); module.exports = { egg: true, framework: 'vue', 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/test', 'app/web/page/html', 'app/web/page/app'], loader: { client: 'app/web/framework/vue/entry/client-loader.js', server: 'app/web/framework/vue/entry/server-loader.js', } }, alias: { server: 'app/web/framework/vue/entry/server.js', client: 'app/web/framework/vue/entry/client.js', app: 'app/web/framework/vue/app.js', asset: 'app/web/asset', component: 'app/web/component', framework: 'app/web/framework', store: 'app/web/store' }, loaders: { eslint: false, less: false, // 沒有使用, 禁用能夠減小npm install安裝時間 stylus: false // 沒有使用, 禁用能夠減小npm install安裝時間 }, plugins: { provide: false, define: { args() { // 支持函數, 這裏僅作演示測試,isNode無實際做用 return { isNode: this.ssr }; } }, commonsChunk: { args: { minChunks: 5 } }, uglifyJs: { args: { compress: { warnings: false } } } } };
node index.js 或 npm starthtml
// 首先安裝 easywebpack-cli 命令行工具
npm i easywebpack-cli -g
// Webpack 編譯文件到磁盤
easywebpck build dev/test/prod前端
在app/web/page 目錄下面建立 home 目錄, home.vue 文件, Webpack自動根據 .vue 文件建立entry入口, 具體實現請見 webpack.config.jsvue
<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>
exports.index = function* (ctx) { yield ctx.render('home/home.js', { message: 'vue server side render!' }); };
app.get('/home', app.controller.home.home.index);
exports.client = function* (ctx) { yield ctx.renderClient('home/home.js', { message: 'vue server side render!' }); };
app.get('/client', app.controller.home.home.client);