2019-09-25 17:47:38 +08:00
|
|
|
|
const {
|
|
|
|
|
compileTemplate
|
|
|
|
|
} = require('@vue/component-compiler-utils');
|
|
|
|
|
const compiler = require('vue-template-compiler');
|
|
|
|
|
|
|
|
|
|
function stripScript(content) {
|
|
|
|
|
const result = content.match(/<(script)>([\s\S]+)<\/\1>/);
|
|
|
|
|
return result && result[2] ? result[2].trim() : '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function stripStyle(content) {
|
|
|
|
|
const result = content.match(/<(style)\s*>([\s\S]+)<\/\1>/);
|
|
|
|
|
return result && result[2] ? result[2].trim() : '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 编写例子时不一定有 template。所以采取的方案是剔除其他的内容
|
|
|
|
|
function stripTemplate(content) {
|
|
|
|
|
content = content.trim();
|
|
|
|
|
if (!content) {
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
return content.replace(/<(script|style)[\s\S]+<\/\1>/g, '').trim();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function pad(source) {
|
|
|
|
|
return source
|
|
|
|
|
.split(/\r?\n/)
|
|
|
|
|
.map(line => ` ${line}`)
|
|
|
|
|
.join('\n');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function genInlineComponentText(template, script) {
|
|
|
|
|
// https://github.com/vuejs/vue-loader/blob/423b8341ab368c2117931e909e2da9af74503635/lib/loaders/templateLoader.js#L46
|
|
|
|
|
const finalOptions = {
|
|
|
|
|
source: `<div>${template}</div>`,
|
|
|
|
|
filename: 'inline-component', // TODO:这里有待调整
|
|
|
|
|
compiler
|
|
|
|
|
};
|
|
|
|
|
const compiled = compileTemplate(finalOptions);
|
|
|
|
|
// tips
|
|
|
|
|
if (compiled.tips && compiled.tips.length) {
|
|
|
|
|
compiled.tips.forEach(tip => {
|
|
|
|
|
console.warn(tip);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
// errors
|
|
|
|
|
if (compiled.errors && compiled.errors.length) {
|
|
|
|
|
console.error(
|
|
|
|
|
`\n Error compiling template:\n${pad(compiled.source)}\n` +
|
|
|
|
|
compiled.errors.map(e => ` - ${e}`).join('\n') +
|
|
|
|
|
'\n'
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
let demoComponentContent = `
|
|
|
|
|
${compiled.code}
|
|
|
|
|
`;
|
|
|
|
|
// todo: 这里采用了硬编码有待改进
|
|
|
|
|
script = script.trim();
|
2019-11-19 20:13:50 +08:00
|
|
|
|
if (script) {
|
|
|
|
|
script = script.replace(/export\s+default/, 'const democomponentExport =');
|
2019-09-25 17:47:38 +08:00
|
|
|
|
} else {
|
|
|
|
|
script = 'const democomponentExport = {}';
|
|
|
|
|
}
|
|
|
|
|
demoComponentContent =
|
|
|
|
|
`(function() {
|
|
|
|
|
${demoComponentContent}
|
|
|
|
|
return {
|
|
|
|
|
render,
|
|
|
|
|
staticRenderFns,
|
|
|
|
|
mounted(){
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
${script}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})()`;
|
2019-11-19 20:13:50 +08:00
|
|
|
|
|
2019-09-25 17:47:38 +08:00
|
|
|
|
// console.log('\n\n\n=================\n\n\n')
|
|
|
|
|
// console.log(demoComponentContent);
|
|
|
|
|
// console.log('\n\n\n=================\n\n\n')
|
2019-11-19 20:13:50 +08:00
|
|
|
|
|
2019-09-25 17:47:38 +08:00
|
|
|
|
return demoComponentContent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
stripScript,
|
|
|
|
|
stripStyle,
|
|
|
|
|
stripTemplate,
|
|
|
|
|
genInlineComponentText
|
|
|
|
|
};
|