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. Linux bash介绍与使用

    Linux————bash的简单使用 对于一个操作系统来说,shell相当于内核kernel外的一层外壳,作为用户接口.一般来说,操作系统的接口分为两类:CLI:command line interf ...

  2. 64位windows上访问64位oracle 12c

    64位windows上访问64位oracle 12c,这会有啥问题? 没啥问题.问题是,我64位操作系统的机器上装了个oracle 10g.而oracle 10g好像是不区分啥32位.64位的,一律3 ...

  3. IIS老革命遇到的一些问题

    今天部署一个网站到IIS,遇到了一些问题.老革命遇上新问题.前不久搞java,接触了一下tomcat,觉得真麻烦.而tomcat大概是java阵营中最简单的了吧.想不到,IIS7,友好的图形界面下,也 ...

  4. 自己写的Android端HttpUtil工具类

    package com.sxt.jcjd.util; import java.io.IOException; import java.io.UnsupportedEncodingException; ...

  5. bzoj 5457 城市

    题目大意: 树上每个点有种类$a_i$和数量$b_i$,求每个点的子树内数量最多的种类的数量和这个数量 思路: 显然是线段树合并裸题 学习一下$dsu \space on \space tree$ 主 ...

  6. uCos-III移植到STM32F10x

    最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境.百度介绍:http://baike.baidu.com/view/8531313.htm 环境: S ...

  7. CF 949 D Curfew —— 二分答案

    题目:http://codeforces.com/contest/949/problem/D 先二分一个答案,让两边都至少满足这个答案: 由于越靠中间的房间越容易满足(被检查的时间靠后),所以策略就是 ...

  8. idea清除缓存和索引

    转自:https://blog.csdn.net/mzy755423868/article/details/80559381

  9. Logrotate日志切割

    日志切割Logrotate 关于日志切割 logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用. 可以节省磁盘空间 ...

  10. Codeforces Round #382 (Div. 2) (模拟|数学)

    题目链接: A:Ostap and Grasshopper B:Urbanization C:Tennis Championship D:Taxes 分析:这场第一二题模拟,三四题数学题 A. 直接模 ...