Skip to content

Commit c86f88f

Browse files
authored
Merge pull request #1 from haisheng-lin/fix-ssr
Fix ssr
2 parents e526e08 + 5a994be commit c86f88f

14 files changed

+734
-49
lines changed

build/webpack.config.base.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const config = {
1111
output: {
1212
filename: 'bundle.[hash:8].js',
1313
path: path.join(__dirname, '../dist'),
14+
publicPath: '//127.0.0.1:8000/public/',
1415
},
1516
module: {
1617
rules: [

build/webpack.config.client.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ const webpack = require('webpack');
55
const webpackMerge = require('webpack-merge');
66
const HtmlPlugin = require('html-webpack-plugin');
77
// 将非 JS 的文件单独打包分离出来,这里主要是希望单独引入 CSS
8-
const ExtractPlugin = require('extract-text-webpack-plugin');
8+
// const ExtractPlugin = require('extract-text-webpack-plugin');
9+
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
910
const baseConfig = require('./webpack.config.base');
1011

1112
const VueClientPlugin = require('vue-server-renderer/client-plugin');
@@ -48,6 +49,7 @@ let config;
4849
if (isDev) {
4950
// webpack-merge 不影响 baseConfig,因为产生的是新结果
5051
config = webpackMerge(baseConfig, {
52+
mode: 'development',
5153
devtool: '#cheap-module-eval-source-map',
5254
devServer,
5355
module: {
@@ -96,6 +98,7 @@ if (isDev) {
9698
});
9799
} else {
98100
config = webpackMerge(baseConfig, {
101+
mode: 'production',
99102
entry: {
100103
// 将类库与第三方依赖单独打包成 vendor,因为如果跟业务代码混在一起,那么由于业务经常更新所以导致这些都无法长期缓存
101104
app: path.join(__dirname, '../client/index.js'),
@@ -110,24 +113,25 @@ if (isDev) {
110113
rules: [
111114
{
112115
test: /\.less$/,
113-
use: ExtractPlugin.extract({
114-
fallback: 'vue-style-loader',
115-
use: [
116-
'css-loader',
117-
{
118-
loader: 'postcss-loader',
119-
options: {
120-
sourceMap: true,
121-
},
116+
use: [
117+
MiniCssExtractPlugin.loader,
118+
'css-loader',
119+
{
120+
loader: 'postcss-loader',
121+
options: {
122+
sourceMap: true,
122123
},
123-
'less-loader',
124-
],
125-
}),
124+
},
125+
'less-loader',
126+
],
126127
},
127128
],
128129
},
129130
plugins: defaultPlugins.concat([
130-
new ExtractPlugin('styles.[hash:8].css'),
131+
new MiniCssExtractPlugin({
132+
filename: 'styles.[contentHash:8].css'
133+
}),
134+
// new ExtractPlugin('styles.[hash:8].css'),
131135
// 在 webpack3 是 webpack.optimize.CommonsChunkPlugin
132136
new webpack.optimize.SplitChunksPlugin({
133137
name: 'runtime',

build/webpack.config.server.js

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const path = require('path');
44
const webpack = require('webpack');
55
const webpackMerge = require('webpack-merge');
66
// 将非 JS 的文件单独打包分离出来,这里主要是希望单独引入 CSS
7-
const ExtractPlugin = require('extract-text-webpack-plugin');
87
const baseConfig = require('./webpack.config.base');
98
// windows npm script 设置变量是通过 set NODE_ENV=production
109
// mac npm script 设置变量是 NODE_ENV=production NODE_ENV=production
@@ -13,6 +12,7 @@ const baseConfig = require('./webpack.config.base');
1312
const VueServerPlugin = require('vue-server-renderer/server-plugin')
1413

1514
const config = webpackMerge(baseConfig, {
15+
mode: 'none',
1616
entry: path.join(__dirname, '../client/server-entry.js'),
1717
target: 'node', // 服务端渲染必须传
1818
devtool: 'source-map',
@@ -31,24 +31,21 @@ const config = webpackMerge(baseConfig, {
3131
// 但是 node 端没有 dom 环境,那么就会报错
3232
// 所以单独打包出来
3333
test: /\.less$/,
34-
use: ExtractPlugin.extract({
35-
fallback: 'vue-style-loader',
36-
use: [
37-
'css-loader',
38-
{
39-
loader: 'postcss-loader',
40-
options: {
41-
sourceMap: true,
42-
},
34+
use: [
35+
'vue-style-loader',
36+
'css-loader',
37+
{
38+
loader: 'postcss-loader',
39+
options: {
40+
sourceMap: true,
4341
},
44-
'less-loader',
45-
],
46-
}),
42+
},
43+
'less-loader',
44+
],
4745
},
4846
],
4947
},
5048
plugins: [
51-
new ExtractPlugin('styles.[hash:8].css'),
5249
new webpack.DefinePlugin({
5350
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
5451
'process.env.VUE_ENV': '"server"',

client/config/routes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ export default [
88
},
99
{
1010
path: '/app',
11+
// component: Todo,
1112
component: () => import('../views/todo/todo.vue'),
1213
},
1314
{
1415
path: '/login',
16+
// component: Login,
1517
component: () => import('../views/login/login.vue'),
1618
},
1719
]

client/create-app.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Vue from 'vue'
2+
import VueRouter from 'vue-router'
3+
import Vuex from 'vuex'
4+
5+
import App from './app.vue'
6+
import createStore from './store/store'
7+
import createRouter from './config/router'
8+
9+
import './assets/styles/global.less'
10+
11+
Vue.use(VueRouter)
12+
Vue.use(Vuex)
13+
14+
export default () => {
15+
const router = createRouter()
16+
const store = createStore()
17+
const app = new Vue({
18+
router,
19+
store,
20+
render: h => h(App),
21+
})
22+
return { app, router, store }
23+
}

client/server-entry.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import createApp from './create-app'
2+
3+
// 这里的 context 等于 server-render 里的 context
4+
export default context => {
5+
const { app, router, store } = createApp()
6+
return new Promise((resolve, reject) => {
7+
router.push(context.url) // 给路由推一条记录,才能进入路由调用组件
8+
router.onReady(() => {
9+
const matchedComponents = router.getMatchedComponents()
10+
if (!matchedComponents.length) {
11+
reject(new Error('no component matched'))
12+
}
13+
resolve(app)
14+
})
15+
})
16+
}

favicon.ico

16.6 KB
Binary file not shown.

nodemon.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"restartable": "rs",
3+
"ignore": [
4+
".git",
5+
"node_modules/**/node_modules",
6+
".eslintrc",
7+
"client",
8+
"build/webpack.config.client.js",
9+
"public"
10+
],
11+
"verbose": true,
12+
"env": {
13+
"NODE_ENV": "development"
14+
},
15+
"ext": "js json ejs"
16+
}

0 commit comments

Comments
 (0)