koa2实现简易的webpack-dev-server热更新

原文https://github.com/zhuangZhou/Blog/issues/3

闲来无事,用koa2撸了一个简易的webpack-dev-server;其实网上很多express搭建的热更新,但是koa2很少;欢迎大佬拍砖和赐教;

源码

配置基本的webpack

1、下载安装包

  • webpack
  • webpack-cli
  • html-webpack-plugin
  • css-loader
  • style-loader

由于这里用的是最新的webpack版本,所以需要安装webpack-cli。

2、创建并配置webpack.config.js

这里就不具体配置了,如需要详细配置教程,请上这里;

基础配置完成后,在plugins里配置HotModuleReplacementPlugin插件用于热更新;由于HotModuleReplacementPlugin是webpack内置的插件,所以不需要安装,直接引用就行

const webpack = require('webpack');
plugins:[
new webpack.HotModuleReplacementPlugin()
]

实现webpack-dev-middleware的koa2中间件

webpack-dev-middleware是实现webpack-dev-server的核心中间件;

1、下载安装包

 npm run webpack-dev-middleware -D

2、创建devMiddleware.js

const webpackDev  = require('webpack-dev-middleware')

const devMiddleware = (compiler, opts) => {
const middleware = webpackDev(compiler, opts)
return async (ctx, next) => {
await middleware(ctx.req, {
end: (content) => {
ctx.body = content
},
setHeader: (name, value) => {
ctx.set(name, value)
}
}, next)
}
} module.exports=devMiddleware;

实现webpack-hot-middleware的koa2中间件

1、下载安装包

npm run webpack-hot-middleware -D

2、创建hotMiddleware.js文件

const webpackHot = require('webpack-hot-middleware')
const PassThrough = require('stream').PassThrough; const hotMiddleware = (compiler, opts) => {
const middleware = webpackHot(compiler, opts);
return async (ctx, next) => {
let stream = new PassThrough()
ctx.body = stream
await middleware(ctx.req, {
write: stream.write.bind(stream),
writeHead: (status, headers) => {
ctx.status = status
ctx.set(headers)
}
}, next)
} } module.exports = hotMiddleware;

配置koa入口文件和引入中间件

1、下载安装包

npm run koa -D

2、创建app.js

const koa = require('koa');
const webpack = require('webpack'); const app = new koa();
const config = require('../webpack.config');
const compiler = webpack(config); const devMiddleware = require('./devMiddleware');
const hotMiddleware = require('./hotMiddleware'); app.use(devMiddleware(compiler, {
noInfo: true,
publicPath: config.output.publicPath
})); app.use(hotMiddleware(compiler,{
reload:true
})); // app.use(serve(__dirname + '/src/', {
// extensions: ['html']
// })); app.listen(3000, () => {
console.log('Example app listening om port 3000!\n');
});

运行

1、在package.json里配置运行命令

"scripts": {
"watch": "webpack --watch",
"server": "node server/app.js",
"build": "webpack"
}

2、启动刚刚配置好的server

npm run server

3、解决问题

当运行后,在浏览器里输入localhost:3000,运行成功;但是当修改index.js后不会自动刷新浏览器;

在webpack.config.js里的entry修改入口文件

entry: {
index: ['webpack-hot-middleware/client?noInfo=true&reload=true','./src/index.js']
}

这样就可以自动刷新了;

关于热更新HTML

这里还是有一个问题,就是关于热更新html文件;由于HTML-webpack-plugin插件运行时是不经过entry入口的,所以就不能自动编译HTML文件;

在网上查了很多种方法,其中就是有一种就是:使用raw-loader,将index.html文件引入index.js中,这样就可以编译了

module:{
rules:[
{
test:/\.(htm|html)$/, use: 'raw-loader'
}
]
}

但是仔细想想,这样是有问题的,就是不能将index.html文件分离出来,所以不推荐;目前还正在研究怎么热更新,后续会更上;

总结

参考

koa2实现简易的webpack-dev-server的更多相关文章

  1. 笔记:配置 webpack dev server

    笔记:配置 webpack dev server 安装 webpack-dev-server 组件 配置 webpack.config.js 配置 增加 html-webpack-plugin 组件 ...

  2. [Webpack] Access Webpack Dev Server from Mobile Safari on an iPhone

    Testing your sites on mobile devices is a critical part of the development process. Webpack dev serv ...

  3. 配置Webpack Dev Server 实战操作方法步骤

    本文摘要:配置 Webpack Dev Server 可以解决本地开发前端应用时,手动执行 webpack 命令或 yarn build 命令,再去浏览器中访问 dist/index.html 的麻烦 ...

  4. webpack dev server 和 sublime text 配合时需要注意的地方

    参考:https://webpack.js.org/guides/development/ Adjusting Your Text Editor Some text editors have a &q ...

  5. webpack dev server 配置 启动项目报错Error: listen EADDRINUSE

    Error: listen EADDRINUSE 0.0.0.0:5601 它的意思是,端口5601被其他进程占用. 切换端口即可解决问题

  6. 解决新版本webpack vue-cli生成文件没有dev.server.js问题

    新版本webpack生成的dev.server.js 在webpack.dev.conf.js中 webpack.dev.conf.js const axios = require('axios') ...

  7. webpack 4 & dev server

    webpack 4 & dev server proxy https://webpack.js.org/configuration/dev-server/#devserverproxy htt ...

  8. vue-cli脚手架之webpack.dev.conf.js

    webpack.dev.conf.js  开发环境模式配置文件: 'use strict'//js按照严格模式执行 const utils = require('./utils')//导入utils. ...

  9. Vue.js如何搭建本地dev server和json-server 模拟请求服务器

    前言:vue-cli(版本更新),由原来的2.8.1升级为2.9.1.主要改变是原来在build文件夹下的dev-server.js删掉了,增加了webpack.dev.conf.js. 所以这次讲的 ...

随机推荐

  1. string string.h cstring 区别

    c++中 string与string.h 的作用和区别 #include  <string.h>  void  main()  {        string  aaa=  "a ...

  2. Trie(前缀树)和ternary trie和binary search tree

    1 什么是trie trie是一棵多叉树,假如存放的是由26个字母(不区分大小写)构成的字符串的话,那么就是一棵26叉树. trie树是一棵前缀树,因为每个结点只保存字符串中的一个字符,整个字符串保存 ...

  3. Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong

    Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong - Mesosphere h ...

  4. SetLocalTime API函数设置本地时间(DateTimeToSystemTime函数,把TDateTime转换成TSystemTime)

    procedure setLocalDateTime(Value: TDateTime);var  lSystemDateTime: TSystemTime;begin  DateTimeToSyst ...

  5. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

  6. casperjs在拆分文件后的中文乱码问题的解决

    windows环境. capserjs的中文乱码使用phantom.outputEncoding="GBK";即可解决. 但当我们脚本很大,需要拆分时(参考http://docs. ...

  7. 什么叫强类型的DATASET

    强类型DataSet,是指需要预先定义对应表的各个字段的属性和取值方式的数据集.对于所有这些属性都需要从DataSet, DataTable, DataRow继承,生成相应的用户自定义类.强类型的一个 ...

  8. ACTION 中 单表查询语句 SQL写法

    JSP页面 <tr> <td class="STYLE1"> <div align="center"> // 单击事件 调用 ...

  9. codeforces 686A A. Free Ice Cream(水题)

    题目链接: A. Free Ice Cream //#include <bits/stdc++.h> #include <vector> #include <iostre ...

  10. SDL2:封装媒体显示播放Csdl2

    Github https://github.com/gongluck/SDL2-study/tree/master/Csdl2 Csdl2.h #ifndef __CSDL2_H__ #define ...