{ plugins: [ new AddAssetHtmlPlugin({ filepath: require.resolve('./dll/vendor.js'), includeSourcemap: false }) ] }
这样,在项目中 webpack 处理 vue vue-router vue-i18n clipboard
时,就不会去node_modules
中拿了,会直接用 vendor.js
再次运行 npm run dev
发现时间也只少了 1s(我觉得其实是时间的小波动...根本不会少的) 毕竟大头不在这。
单组件的开发模式
后来突然想到,好像每次开发组件的时候,不都是单个单个来的吗,既然这样,我只处理指定组件的md文件,速度不就起来了吗。
嗯,这或许是个办法,试试水
找到引入 md 文件的地方,也就是 examples/route.js,部分代码如下
function loadDocs(path) { return r => require.ensure([], () => r(require(`./docs${path}.md`)) ); }
这个是 vue-router 的动态加载,嗯,只要我把path给写成一个固定的路径(这里其实就是'/' + 组件名),不就能实现了吗。
运行命令大概是长这样的
// package.json { "scripts": { "dev:component": "cross-env RUN_ENV=component node build/dev-server.js", } }
由于在命令行中使用webpack-dev-server
没有办法传递参数给process.argv
,所以这里采用webpack-hot-middleware
// build/dev-server.js const webpack = require('webpack'); const webpackConfig = require('./config.dev'); const express = require('express'); webpackConfig.plugins = webpackConfig.plugins || []; // 全局开发模式采用webpack-dev-server 无需配置hmr,这里需要单独给上 webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin()); webpackConfig.entry.push('webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'); const compiler = webpack(webpackConfig); const hotMiddleware = require('webpack-hot-middleware')(compiler, { log: false }); const devMiddleware = require('webpack-dev-middleware')(compiler, { publicPath: webpackConfig.output.publicPath, quiet: true, logLevel: 'silent' }); const app = express(); app.use(hotMiddleware); app.use(devMiddleware); app.use('/build', express.static('./build')); app.listen(webpackConfig.devServer.port || 8089, '127.0.0.1', () => { console.log('Starting server on http://localhost:8089'); });
然后采用webpack的 DefinePlugin 动态写入一个组件名就搞定了,大致的思路是这样的。部分实现如下:
const component = process.argv[2]; // 先判断一下是不是单组件开发模式,是的话,必须指定运行的组件 if (process.env.RUN_ENV === 'component' && !component) { throw new Error('component is required, like: npm run dev:component slider'); } // 然后通过DefinePlugin写入 // 对了这里有个要注意的点,path是个变量,不是字符串,所以不能是"'path'",真tm机智。 // config.dev.js { // ... plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: "'development'", RUN_ENV: process.env.RUN_ENV === 'component' ? "'component'" : "''", component: process.env.RUN_ENV === 'component' ? JSON.stringify('/' + component) : 'path' } }) ] // ... } // 然后再把 `route.js` 的源码改下 function loadDocs(path) { return r => require.ensure([], () => r(require(`./docs${process.env.path}.md`)) ); }
内容版权声明:除非注明,否则皆为本站原创文章。