Skip to content

Commit 305f81e

Browse files
committed
update test
1 parent 522c75b commit 305f81e

File tree

9 files changed

+149
-25
lines changed

9 files changed

+149
-25
lines changed

README-zh.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ npm install vue-easy-renderer -S
1919
Peer Dependency
2020

2121
```bash
22-
npm i vue vuex vue-loader vue-server-renderer -S
22+
npm i vue vuex vue-router vue-loader vue-server-renderer -S
2323
```
2424

2525
## Example
@@ -153,7 +153,6 @@ const vueEasyRenderer = require('vue-easy-renderer').connectRenderer;
153153
| basePath | `string` | `*.vue` 文件路径 |
154154
| [options] | `Object` | renderer 的 options |
155155
| [options.watch] | `Boolean` | 默认值 `false`, 是否监控 '*.vue' 的变更, 当process.env.NODE_ENV|
156-
| [options.store] | `string` | 枚举 `'on'` `'off'` `'auto'`, 默认为 `'auto'`. 当设置为`on`的时候,会将数据渲染到vuex的state中;如果为`off`,将会渲染到vue实例的data中,如果为`auto`,会自动检查vue是否使用了vuex,如果使用了vuex就回渲染到state中,否则渲染到data中|
157156
| [options.plugins] | `Array` \| `string` | vue插件, 如 `[vueRouter]` 或者 `[{plugin: vueRouter,options: {}}]`, 同时也支持字符串,如: `[path.resolve('../app/resource.js')]` |
158157
| [options.preCompile] | `Array` | 需要预编译的 `*.vue` 文件路径列表,如:`['test.vue']` |
159158
| [options.head] | `Object` | 通用的html头部设置, 详情见 [Component Head](#component-head) |
@@ -171,7 +170,7 @@ Base usage
171170

172171
```js
173172
import Vue from 'vue';
174-
import vueEasyRenderer from 'vue-easy-renderer/dist/plugin';
173+
import vueEasyRenderer from 'vue-easy-renderer/lib/plugins/client';
175174
import App from './app.vue';
176175

177176
Vue.use(vueEasyRenderer);

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ npm install vue-easy-renderer -S
2121
Peer Dependency
2222

2323
```bash
24-
npm i vue vuex vue-loader vue-server-renderer -S
24+
npm i vue vuex vue-router vue-loader vue-server-renderer -S
2525
```
2626

2727
## Example
@@ -155,7 +155,6 @@ const vueEasyRenderer = require('vue-easy-renderer').connectRenderer;
155155
| basePath | `string` | `*.vue` file base path |
156156
| [options] | `Object` | renderer options |
157157
| [options.watch] | `Boolean` | default `false`, watch the '*.vue' file changes |
158-
| [options.store] | `string` | enum `'on'` `'off'` `'auto'`, default `'auto'`. when is 'on', renderer use vuex store, when 'auto', renderer will check the vue options, then renderer set data to vuex or vue data depend on vue options 'store' property|
159158
| [options.plugins] | `Array` \| `string` | vue plugins, e.g. `[vueRouter]` or `[{plugin: vueRouter,options: {}}]`, it also support using plugin path string, e.g. `[path.resolve('../app/resource.js')]` |
160159
| [options.preCompile] | `Array` | pre-compile `*.vue` file list |
161160
| [options.head] | `Object` | common html head config see detail in [Component Head](#component-head) |
@@ -173,7 +172,7 @@ Base usage
173172

174173
```js
175174
import Vue from 'vue';
176-
import vueEasyRenderer from 'vue-easy-renderer/dist/plugin';
175+
import vueEasyRenderer from 'vue-easy-renderer/lib/plugins/client';
177176
import App from './app.vue';
178177

179178
Vue.use(vueEasyRenderer);

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
"scripts": {
1010
"pretest": "npm run build",
1111
"check": "flow check",
12-
"build:client":"babel src/plugins/client.js --out-file lib/plugins/client.js --presets=es2015 --plugins=transform-object-assign && mkdir dist; cp lib/plugins/client.js dist/plugin.js",
12+
"build:client": "babel src/plugins/client.js --out-file lib/plugins/client.js --presets=es2015 --plugins=transform-object-assign && mkdir dist; cp lib/plugins/client.js dist/plugin.js",
1313
"build:server": "npm run check && rm -rf lib/* && flow-remove-types src/ -d lib/ --pretty && rm -f lib/type.js",
14-
"build":"npm run build:client & npm run build:server",
14+
"build": "npm run build:client & npm run build:server",
1515
"test": "nyc ava",
1616
"preversion": "npm test",
1717
"version": "npm run build && git add -A",

src/plugins/server.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const SSRServerPlugin = {
88
beforeCreate(): void {
99
if (this.$parent) return;
1010
const context = this.$options.$context;
11+
if (!context) return;
1112
Object.keys(this.$options).forEach((key) => {
1213
if (typeof this.$options[key].$ssrInstance === 'function') {
1314
this.$options[key] = this.$options[key].$ssrInstance();

src/renderer/compiler.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ class Compiler implements ICompiler {
1919
basePath: string;
2020
watch: boolean;
2121
contextGlobal: ?Object;
22-
constructor(fs: FileSystem, options: CompilerOptions) {
22+
constructor(fs: FileSystem, options?: CompilerOptions) {
2323
this.fs = fs;
24-
this.basePath = options.basePath;
25-
this.watch = options.watch;
26-
this.contextGlobal = options.global;
24+
this.basePath = options ? options.basePath : __dirname;
25+
this.watch = options ? options.watch : false;
26+
this.contextGlobal = options ? options.global : Object.create(null);
2727
}
2828
/**
2929
* dynamic import
@@ -43,9 +43,9 @@ class Compiler implements ICompiler {
4343
return new Promise((resolve, reject) => compilingWaitingQueue.push({ resolve, reject }));
4444
}
4545

46-
this.load([request]);
47-
return new Promise((resolve, reject) =>
46+
const resultPromise = new Promise((resolve, reject) =>
4847
compilingWaitingQueueMap.set(request, [{ resolve, reject }]));
48+
return this.load([request]).then(() => resultPromise);
4949
}
5050

5151
/**
@@ -65,13 +65,12 @@ class Compiler implements ICompiler {
6565
serverCompiler.outputFileSystem = this.fs;
6666
const runner = this.watch ? cb => serverCompiler.watch({}, cb) : cb => serverCompiler.run(cb);
6767
return new Promise((resolve, reject) => {
68-
console.time('compile');
6968
runner((error, stats) => {
7069
if (error) {
7170
reject(error);
7271
return;
7372
}
74-
console.timeEnd('compile');
73+
7574
const info = stats.toJson();
7675
if (stats.hasErrors()) {
7776
reject(info.errors);
@@ -90,6 +89,7 @@ class Compiler implements ICompiler {
9089
* @memberof Compiler
9190
*/
9291
load(filePaths: Array<string>): Promise<void> {
92+
if (filePaths.length === 0) return Promise.resolve();
9393
filePaths.forEach((filePath) => {
9494
if (!compilingWaitingQueueMap.has(filePath)) {
9595
compilingWaitingQueueMap.set(filePath, []);
@@ -202,7 +202,6 @@ class Compiler implements ICompiler {
202202
],
203203
};
204204
config.entry = entry;
205-
206205
return config;
207206
}
208207
/**

src/renderer/renderer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ class Renderer extends EventEmitter implements IRenderer {
5656
}
5757
});
5858
this.options.preCompile.push(...needCompiledPlugin);
59-
this.compiler.load(this.options.preCompile).then(() => this.emit('ready')).catch(e => this.emit('error', e));
59+
this.compiler.load(this.options.preCompile).then(() => {
60+
this.emit('ready');
61+
}).catch(e => this.emit('error', e));
6062
}
6163

6264
/**

test/compiler.js renamed to test/renderer/compiler.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
const path = require('path');
22
const test = require('ava');
33
const MemoryFs = require('memory-fs');
4-
const Compiler = require('../lib/renderer/compiler');
4+
const Compiler = require('../../lib/renderer/compiler');
55

66
test('Compiler.import', async (t) => {
7-
const compiler = new Compiler(new MemoryFs(), { basePath: path.resolve(__dirname, './vue_file') });
8-
const vueOptions = await compiler.import(path.resolve(__dirname, './vue_file/store.vue'));
7+
const compiler = new Compiler(new MemoryFs(), { basePath: path.resolve(__dirname, '../vue_file') });
8+
const vueOptions = await compiler.import(path.resolve(__dirname, '../vue_file/store.vue'));
99
t.truthy(vueOptions.default);
1010
});
1111
test('Compiler.load', async (t) => {
12-
const compiler = new Compiler(new MemoryFs(), { basePath: path.resolve(__dirname, './vue_file') });
12+
const compiler = new Compiler(new MemoryFs(), { basePath: path.resolve(__dirname, '../vue_file') });
1313
const preloadFiles = [
14-
path.resolve(__dirname, './vue_file/store.vue'),
15-
path.resolve(__dirname, './vue_file/simple.vue'),
14+
path.resolve(__dirname, '../vue_file/store.vue'),
15+
path.resolve(__dirname, '../vue_file/simple.vue'),
1616
];
1717
await compiler.load(preloadFiles);
1818
const startTime = Date.now();
19-
const vueOptions = await compiler.import(path.resolve(__dirname, './vue_file/store.vue'));
19+
const vueOptions = await compiler.import(path.resolve(__dirname, '../vue_file/store.vue'));
2020
const endTime = Date.now();
2121
t.true(endTime - startTime < 10);
2222
t.truthy(vueOptions.default);

test/renderer/head.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
3+
const test = require('ava');
4+
const VueHead = require('../../lib/renderer/head.js');
5+
6+
test('VueHead.toHtmlString() should be ok', (t) => {
7+
const headOptions = {
8+
meta: [{
9+
name: '123',
10+
}],
11+
title: 'test',
12+
script: [
13+
{ src: 'a.js' },
14+
{ src: 'b.js' },
15+
],
16+
};
17+
const vueHead = new VueHead(headOptions);
18+
const html = vueHead.toHtmlString();
19+
t.is(html, '<meta name="123">\n<title>test</title>\n<script src="a.js"></script>\n<script src="b.js"></script>\n');
20+
});
21+

test/renderer/renderer.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
2+
3+
const path = require('path');
4+
const test = require('ava');
5+
const chai = require('chai');
6+
const MemoryFS = require('memory-fs');
7+
const Compiler = require('../../lib/renderer/compiler');
8+
const Renderer = require('../../lib/renderer/renderer');
9+
10+
const expect = chai.expect;
11+
12+
13+
test('Renderer.constructor() should be ok with options.head', async (t) => {
14+
const filePath = path.resolve(__dirname, '../vue_file/simple_head.vue');
15+
const compiler = new Compiler(new MemoryFS());
16+
const renderer = new Renderer(compiler);
17+
try {
18+
const string = await renderer.renderToString(filePath, { hello: 'world!' });
19+
t.true(string.includes('<title>TITLE_TEST</title'));
20+
} catch (e) {
21+
t.fail(e);
22+
}
23+
});
24+
test.cb('Renderer.constructor() should be ok with options.preCompile', (t) => {
25+
const filePath = path.resolve(__dirname, '../vue_file/simple.vue');
26+
const compiler = new Compiler(new MemoryFS());
27+
const renderer = new Renderer(compiler, { preCompile: [filePath] });
28+
29+
renderer.on('ready', async () => {
30+
const startTime = Date.now();
31+
const vueOptions = await compiler.import(path.resolve(__dirname, '../vue_file/simple.vue'));
32+
const endTime = Date.now();
33+
t.true(endTime - startTime < 10);
34+
t.truthy(vueOptions.default);
35+
t.end();
36+
});
37+
});
38+
test('Renderer.constructor() should be ok with options.global', async (t) => {
39+
const filePath = path.resolve(__dirname, '../vue_file/simple_global.vue');
40+
const compiler = new Compiler(new MemoryFS(), { global: { APP_VERSION: 'v1.0.0' } });
41+
const renderer = new Renderer(compiler, { global: { APP_VERSION: 'v1.0.0' } });
42+
const string = await renderer.renderToString(filePath, {});
43+
44+
t.true(string.includes('<script src="/app.js?_v=v1.0.0" defer="true">'));
45+
t.true(string.includes('<script>window.APP_VERSION = "v1.0.0"; </script>'));
46+
});
47+
test('renderer.getComponent() should be ok', async (t) => {
48+
const filePath = path.resolve(__dirname, '../vue_file/simple.vue');
49+
const compiler = new Compiler(new MemoryFS());
50+
const renderer = new Renderer(compiler);
51+
52+
const component = await renderer.getComponent(filePath, { state: { hello: 'world!' } });
53+
t.is(component.hello, 'world!');
54+
});
55+
test('renderer.renderToString() should be ok', async (t) => {
56+
const filePath = path.resolve(__dirname, '../vue_file/simple.vue');
57+
const compiler = new Compiler(new MemoryFS());
58+
const renderer = new Renderer(compiler);
59+
renderer.on('error', e => t.fail(e));
60+
const string = await renderer.renderToString(filePath, { hello: 'world!' });
61+
t.true(string.includes('hello world!'));
62+
});
63+
64+
test('renderer.renderToString() should be ok with option pure', async (t) => {
65+
const filePath = path.resolve(__dirname, '../vue_file/simple.vue');
66+
const compiler = new Compiler(new MemoryFS());
67+
const renderer = new Renderer(compiler);
68+
renderer.on('error', e => t.fail(e));
69+
const string = await renderer.renderToString(filePath, { hello: 'world!' }, { pure: true });
70+
t.true(string.includes('hello world!'));
71+
t.false(string.includes('html'));
72+
});
73+
74+
test('renderer.renderToStream() should be ok', async (t) => {
75+
const filePath = path.resolve(__dirname, '../vue_file/simple.vue');
76+
const compiler = new Compiler(new MemoryFS());
77+
const renderer = new Renderer(compiler);
78+
await renderer.renderToStream(filePath, { hello: 'world!' });
79+
t.pass();
80+
});
81+
82+
test('Renderer should be ok with store', async (t) => {
83+
const filePath = path.resolve(__dirname, '../vue_file/store.vue');
84+
const compiler = new Compiler(new MemoryFS());
85+
const renderer = new Renderer(compiler, { useStore: 'auto' });
86+
renderer.on('error', e => t.fail(e));
87+
const string = await renderer.renderToString(filePath, { world: 'world!' });
88+
t.true(string.includes('hello world!'));
89+
});
90+
91+
test.cb('renderer.on(\'ready\') should be ok', (t) => {
92+
const compiler = new Compiler(new MemoryFS(), { basePath: path.resolve(__dirname, '../vue_file') });
93+
const renderer = new Renderer(compiler);
94+
renderer.on('ready', () => {
95+
t.pass();
96+
t.end();
97+
});
98+
renderer.on('error', (e) => {
99+
t.fail(e);
100+
t.end();
101+
});
102+
});
103+

0 commit comments

Comments
 (0)