function render(tokens, idx) { // tokens是markdown-it parse后的结果 var m = tokens[idx].info.trim().match(/^demo\s*(.*)$/); if (tokens[idx].nesting === 1) { let index = idx + 1; var html = ''; var style = ''; var script = ''; while (tokens[index].nesting === 0) { const content = tokens[index].content; const tag = tokens[index].info; if (tag === 'html') { html = convert(striptags.strip(content, ['script', 'style'])).replace( /(<[^>]*)=""(?=.*>)/g, '$1' ); script = striptags.fetch(content, 'script'); style = striptags.fetch(content, 'style'); } else if (tag === 'js' && !script) { script = striptags.fetch(content, 'script'); } else if ( ['css', 'style', 'scss'].indexOf(tag) !== -1 && !style ) { style = striptags.fetch(content, 'style'); } index++; } var description = m && m.length > 1 ? m[1] : ''; var jsfiddle = { html: html, script: script, style: style }; var descriptionHTML = description ? md.render(description) : ''; jsfiddle = md.utils.escapeHtml(JSON.stringify(jsfiddle)); return ` <demo-block class="demo-box" :jsfiddle="${jsfiddle}"> <div class="source" slot="source">${html}</div> ${descriptionHTML} <div class="hljs highlight" slot="highlight"> `; } return '</div></demo-block>\n'; }
详解组件库的webpack构建速度优化(2)
主要是将 tip 放到指定的 container 里。还有提取 tokens 里一些标记为html js css代码组成一个对象jsfiddle,传给一个 vue组件,用于提供jsbin的在线调试功能。利用markdown-it的 render方法,将其他采用markdown语法写的文档render成html代码放到指定div里面,将 html 代码(其实就是文档中的示例代码)作为slot分发给上面提到的 vue组件。
这里实在是没找到优化的手段。
引入dll
另外一个尝试的手段是,采用webpack的 DllPlugin 和 DllReferencePlugin 引入dll,让一些基本不会改动的代码先打包成静态资源,让 webpack 少处理一些东西
打包dll的配置
// config.dll.js module.exports = merge(base, { // ... entry: { vendor: ['vue', 'vue-router', 'vue-i18n', 'clipboard'] }, output: { path: path.resolve(__dirname, './dll'), filename: '[name].js', library: '[name]_[hash]' }, plugins: [ new webpack.DllPlugin({ name: '[name]_[hash]', path: path.resolve(__dirname, './dll/vendor.manifest.json') }) ] // ... })
上面配置打包会在 build 目录下生成 dll 目录,里面有 vendor.dll.js
和 vendor.manifest.json
然后在 config.dev.js
中,引入 DllReferencePlugin
DllReferencePlugin配置
{ plugins: [ new webpack.DllReferencePlugin({ manifest: require('./dll/vendor.manifest.json') }) ] }
然后记得将打包好的js文件引入,这里可以采用add-asset-html-webpack-plugin