Skip to content

Commit cb80698

Browse files
author
season
committed
support rumtimeOnly for vue2
1 parent 06034d3 commit cb80698

File tree

38 files changed

+1113
-22
lines changed

38 files changed

+1113
-22
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,16 @@ fis.match('src/**.vue', {
126126
cssScopedIdPrefix: '_v-', // hash前缀:_v-23j232jj
127127
cssScopedHashType: 'sum', // hash生成模式,num:使用`hash-sum`, md5: 使用`fis.util.md5`
128128
cssScopedHashLength: 8, // hash 长度,cssScopedHashType为md5时有效
129-
styleNameJoin: '' // 样式文件命名连接符 `component-a.css`
129+
styleNameJoin: '', // 样式文件命名连接符 `component-a.css`
130+
runtimeOnly: true, // vue@2.x 有润timeOnly模式,为ture时,template会在构建时转为render方法
130131
})
131132
});
132133
```
133134

134135
## 测试demo
135136

137+
> test 对应vue1, test2对应vue2
138+
136139
`npm install`
137140

138141
`cd test`, 编写代码…
@@ -196,6 +199,3 @@ fis.match('src/**.vue:jsx', {
196199
]
197200
})
198201
```
199-
200-
201-

index.js

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
var path = require('path');
2+
var chalk = require('chalk')
23
var parse5 = require('parse5');
3-
var validateTemplate = require('vue-template-validator');
44
var deindent = require('de-indent');
55
var objectAssign = require('object-assign');
66
var hashSum = require('hash-sum');
7+
var compiler = require('vue-template-compiler');
8+
var transpile = require('vue-template-es2015-compiler');
9+
var validateTemplate = require('vue-template-validator');
710

811
function getAttribute(node, name) {
912
if (node.attrs) {
@@ -30,7 +33,9 @@ module.exports = function(content, file, conf) {
3033
cssScopedIdPrefix: '_v-',
3134
cssScopedHashType: 'sum',
3235
cssScopedHashLength: 8,
33-
styleNameJoin: ''
36+
styleNameJoin: '',
37+
38+
runtimeOnly: false,
3439
}, conf);
3540

3641
// 兼容content为buffer的情况
@@ -116,23 +121,61 @@ module.exports = function(content, file, conf) {
116121
}
117122

118123
// template
119-
if (output['template'].length) {
120-
templateContent = fis.compile.partial(output['template'][0].content, file, {
121-
ext: output['template'][0].lang,
122-
isHtmlLike: true
123-
});
124+
if (configs.runtimeOnly) {
125+
// runtimeOnly
126+
127+
function toFunction (code) {
128+
// console.log(code);
129+
return transpile('function render () {' + code + '}')
130+
}
131+
132+
if (output['template'].length) {
133+
templateContent = fis.compile.partial(output['template'][0].content, file, {
134+
ext: output['template'][0].lang,
135+
isHtmlLike: true
136+
});
137+
138+
var compiled = compiler.compile(templateContent);
139+
var renderFun, staticRenderFns;
124140

125-
validateTemplate(output['template'][0].content).forEach(function(msg) {
126-
console.log(msg)
127-
})
141+
if (compiled.errors.length) {
142+
compiled.errors.forEach(function (err) {
143+
console.error('\n' + chalk.red(err) + '\n')
144+
});
145+
throw new Error('Vue template compilation failed');
146+
} else {
147+
renderFun = toFunction(compiled.render);
148+
staticRenderFns = '[' + compiled.staticRenderFns.map(toFunction).join(',') + ']';
149+
}
150+
} else {
151+
renderFun = 'function(){}';
152+
staticRenderFns = '[]';
153+
}
128154

129-
scriptStr += '\n;\n(function(template){\n'
130-
scriptStr += '\nmodule && module.exports && (module.exports.template = template);\n';
131-
scriptStr += '\nexports && exports.default && (exports.default.template = template);\n';
132-
scriptStr += '\n})(' + JSON.stringify(templateContent) + ');\n';
155+
scriptStr += '\n;\n(function(renderFun, staticRenderFns){\n'
156+
scriptStr += '\nif(module && module.exports){ module.exports.render=renderFun; module.exports.staticRenderFns=staticRenderFns;}\n';
157+
scriptStr += '\nif(exports && exports.default){ exports.default.render=renderFun; exports.default.staticRenderFns=staticRenderFns;}\n';
158+
scriptStr += '\n})(' + renderFun + ',' + staticRenderFns + ');\n';
133159
} else {
134-
scriptStr += '\nmodule && module.exports && (module.exports.template = "");\n';
135-
scriptStr += '\nexports && exports.default && (exports.default.template = "");\n';
160+
// template
161+
if (output['template'].length) {
162+
templateContent = fis.compile.partial(output['template'][0].content, file, {
163+
ext: output['template'][0].lang,
164+
isHtmlLike: true
165+
});
166+
167+
validateTemplate(output['template'][0].content).forEach(function(msg) {
168+
console.log(msg);
169+
})
170+
171+
scriptStr += '\n;\n(function(template){\n'
172+
scriptStr += '\nmodule && module.exports && (module.exports.template = template);\n';
173+
scriptStr += '\nexports && exports.default && (exports.default.template = template);\n';
174+
scriptStr += '\n})(' + JSON.stringify(templateContent) + ');\n';
175+
} else {
176+
scriptStr += '\nmodule && module.exports && (module.exports.template = "");\n';
177+
scriptStr += '\nexports && exports.default && (exports.default.template = "");\n';
178+
}
136179
}
137180

138181
// 部分内容以 js 的方式编译一次。如果要支持 es6 需要这么配置。

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fis3-parser-vue-component",
3-
"version": "4.0.3",
3+
"version": "5.0.0",
44
"description": "A parser plugin for fis3 to parser vue component.",
55
"keywords": [
66
"fis3",
@@ -11,10 +11,13 @@
1111
],
1212
"main": "index.js",
1313
"dependencies": {
14+
"chalk": "^1.1.3",
1415
"de-indent": "^1.0.2",
1516
"hash-sum": "^1.0.2",
1617
"object-assign": "^4.1.0",
1718
"parse5": "^2.1.5",
19+
"vue-template-compiler": "^2.1.6",
20+
"vue-template-es2015-compiler": "^1.4.0",
1821
"vue-template-validator": "^1.1.5"
1922
},
2023
"devDependencies": {},

test/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"fis3-hook-commonjs": "^0.1.22",
2020
"fis3-hook-node_modules": "^2.2.3",
2121
"fis3-parser-less-2.x": "^0.1.4",
22-
"fis3-parser-node-sass": "^0.1.9",
22+
"fis-parser-node-sass": "^1.0.1",
2323
"fis3-parser-translate-es3ify": "0.0.2",
2424
"fis3-parser-vue-component": "^1.2.1",
2525
"fis3-postpackager-loader": "^1.5.2",

test2/fis-conf.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
var path = require('path');
2+
var parserVuePlugin = require('../index');
3+
4+
// 需要构建的文件
5+
fis.set('project.fileType.text', 'vue');
6+
fis.set('project.files', ['src/**']);
7+
fis.set('project.ignore', fis.get('project.ignore').concat(['output/**', 'DS_store']));
8+
9+
// 模块化支持插件
10+
// https://github.com/fex-team/fis3-hook-commonjs (forwardDeclaration: true)
11+
fis.hook('commonjs', {
12+
extList: [
13+
'.js', '.coffee', '.es6', '.jsx', '.vue',
14+
],
15+
umd2commonjs: true,
16+
ignoreDependencies: [
17+
18+
]
19+
});
20+
21+
// 禁用components,启用node_modules
22+
fis.unhook('components');
23+
fis.hook('node_modules');
24+
25+
// 所有js文件
26+
fis.match('**.js', {
27+
isMod: true,
28+
rExt: 'js',
29+
useSameNameRequire: true
30+
});
31+
32+
// 编译vue组件
33+
fis.match('src/**.vue', {
34+
isMod: true,
35+
rExt: 'js',
36+
useSameNameRequire: true,
37+
parser: function(content, file, conf) {
38+
conf.runtimeOnly = true;
39+
return parserVuePlugin(content, file, conf);
40+
},
41+
});
42+
43+
fis.match('src/**.vue:js', {
44+
parser: [
45+
fis.plugin('babel-6.x', {
46+
presets: ['es2015-without-strict', 'react', 'stage-3'],
47+
}),
48+
fis.plugin('translate-es3ify', null, 'append')
49+
]
50+
})
51+
52+
fis.match('src/**.vue:jade', {
53+
parser: [
54+
fis.plugin('jade', {
55+
//
56+
})
57+
]
58+
})
59+
60+
fis.match('src/{**.vue:less,**.less}', {
61+
rExt: 'css',
62+
parser: [fis.plugin('less-2.x')],
63+
postprocessor: fis.plugin('autoprefixer')
64+
});
65+
66+
fis.match('src/{**.vue:scss,**.scss}', {
67+
rExt: 'css',
68+
parser: [fis.plugin('node-sass')],
69+
postprocessor: fis.plugin('autoprefixer'),
70+
});
71+
72+
// 发布
73+
fis.match('/src/(**)', {
74+
release: '$1'
75+
});
76+
77+
//
78+
fis.match('src/(component/**.css)', {
79+
release: 'static/$1'
80+
});
81+
82+
// 模块文件
83+
fis.match('/src/**.js', {
84+
parser: [
85+
fis.plugin('babel-6.x', {
86+
presets: ['es2015-loose', 'react', 'stage-3']
87+
}),
88+
fis.plugin('translate-es3ify', null, 'append')
89+
]
90+
});
91+
92+
// 非模块文件
93+
fis.match('/src/js/engine/**.js', {
94+
parser: null,
95+
isMod: false
96+
});
97+
98+
// 页面直接引入的文件,不进行模块require包装
99+
fis.match('/src/js/page/**.js', {
100+
isMod: false
101+
});
102+
103+
// 打包
104+
fis.match('::package', {
105+
postpackager: fis.plugin('loader'),
106+
});
107+
108+
// 部署
109+
fis
110+
.media('local')
111+
.match('**', {
112+
deploy: fis.plugin('local-deliver', {
113+
to: path.join(__dirname, './output/')
114+
})
115+
});

test2/output/component/a.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
define('src/component/a.vue', function(require, exports, module) {
2+
3+
module.exports = {
4+
created: function created() {
5+
console.log('component a created !');
6+
},
7+
8+
methods: {
9+
//
10+
}
11+
};
12+
(function (renderFun, staticRenderFns) {
13+
14+
module && module.exports && ((module.exports.render = renderFun) || (module.exports.staticRenderFns = staticRenderFns));
15+
16+
exports && exports["default"] && ((exports["default"].render = renderFun) || (exports["default"].staticRenderFns = staticRenderFns));
17+
})(function render() {
18+
var _vm = this;var _h = _vm.$createElement;var _c = _vm._c;return _c('div', { staticClass: "component-a", attrs: { "_v-16c48809": "" } }, [_vm._v("\n Component A\n")]);
19+
}, []);
20+
21+
});

test2/output/component/b.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
define('src/component/b.vue', function(require, exports, module) {
2+
3+
module.exports = {
4+
created: function created() {
5+
console.log('component b created !');
6+
},
7+
8+
methods: {
9+
hello: function hello() {
10+
alert('hello!');
11+
}
12+
}
13+
};
14+
(function (renderFun, staticRenderFns) {
15+
16+
module && module.exports && ((module.exports.render = renderFun) || (module.exports.staticRenderFns = staticRenderFns));
17+
18+
exports && exports["default"] && ((exports["default"].render = renderFun) || (exports["default"].staticRenderFns = staticRenderFns));
19+
})(function render() {
20+
var _vm = this;var _h = _vm.$createElement;var _c = _vm._c;return _c('div', { staticClass: "component-b" }, [_vm._v("\n Component B "), _c('a', { attrs: { "href": "javascript:;" }, on: { "click": _vm.hello } }, [_vm._v("Click Me")])]);
21+
}, []);
22+
23+
});

test2/output/component/c.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
define('src/component/c.vue', function(require, exports, module) {
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports["default"] = {
7+
created: function created() {
8+
console.log('component c created !');
9+
},
10+
11+
methods: {
12+
//
13+
}
14+
};
15+
16+
(function (renderFun, staticRenderFns) {
17+
18+
module && module.exports && ((module.exports.render = renderFun) || (module.exports.staticRenderFns = staticRenderFns));
19+
20+
exports && exports["default"] && ((exports["default"].render = renderFun) || (exports["default"].staticRenderFns = staticRenderFns));
21+
})(function render() {
22+
var _vm = this;var _h = _vm.$createElement;var _c = _vm._c;return _c('div', { staticClass: "component-c" }, [_vm._v("\n Component C\n\n")]);
23+
}, []);
24+
25+
});

test2/output/component/index.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
define('src/component/index.vue', function(require, exports, module) {
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _a = require('src/component/a.vue');
8+
9+
var _a2 = _interopRequireDefault(_a);
10+
11+
var _b = require('src/component/b.vue');
12+
13+
var _b2 = _interopRequireDefault(_b);
14+
15+
var _jade = require('src/component/jade.vue');
16+
17+
var _jade2 = _interopRequireDefault(_jade);
18+
19+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
20+
21+
// @require 'src/less/other2.less';
22+
23+
exports["default"] = {
24+
components: {
25+
ComponentA: _a2["default"],
26+
ComponentB: _b2["default"],
27+
ComponentJade: _jade2["default"],
28+
ComponentC: require('src/component/c.vue')
29+
},
30+
created: function created() {
31+
console.log('Index page created!');
32+
},
33+
34+
methods: {
35+
//
36+
}
37+
};
38+
39+
(function (renderFun, staticRenderFns) {
40+
41+
module && module.exports && ((module.exports.render = renderFun) || (module.exports.staticRenderFns = staticRenderFns));
42+
43+
exports && exports["default"] && ((exports["default"].render = renderFun) || (exports["default"].staticRenderFns = staticRenderFns));
44+
})(function render() {
45+
var _vm = this;var _h = _vm.$createElement;var _c = _vm._c;return _c('div', { staticClass: "index _v-4ddb37f2" }, [_c('p', [_vm._v("fis3-parser-vue-component demo runing ~")]), _vm._v(" "), _c('component-a'), _vm._v(" "), _c('component-b'), _vm._v(" "), _c('component-c'), _vm._v(" "), _c('component-jade')]);
46+
}, []);
47+
48+
});

0 commit comments

Comments
 (0)