关于Webpack的资料教程网上已经数不胜数,但是对手动配置一个Express server的确不多,于是我对此进行着重的了解一番。

  webpack-dev-middleware和webpack-hot-middleware分别是干什么的?

  首先这两个插件组合起来是可以实现页面的热刷新工作, 而做到这一点,首先要对更改的文件进行监控,编译,而这个webpack-dev-middleware就是干这个的,专业点叫做伺服器,而webpack-hot-middleware 是用来进行页面的热重载的。而且这些文件资源并不会出现在真实的路径里,而是保存在内存中,如果文件改变,这个伺服器就不在去请求旧的文件,而是延迟请求直到新的文件编译完成。

  开始编码

  你可以使用一份你之前练手的webpack项目,写好正确的配置文件(webpack.config.js),基本上会和下面的我的这份类似,并没有太多的东西:

  

var path = require("path");
var webpack = require("webpack");
//var ExtractTextPlugin = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {entry: "./src/js/page/index.js",
output:{
path : path.join(__dirname,'dist'),
publicPath : "/webpack/dist",
filename : "js/[name].js"
},
module:{
loaders:[
{ test: /\.css$/, loader: 'style-loader!css-loader' }
]
},
plugins:[
//new ExtractTextPlugin("css/[name].css"),new HtmlWebpackPlugin({
filename:'index.html',
template:'./src/view/index.html',
inject:true,
hash:true,
minify:{
removeComments:true,
collapseWhitespace:false
}
})
]
}

 使用webpack-dev-middleware

  下面在跟目录下新建一个dev-server.js,然后写下如下的代码:

const path = require("path")
const express = require("express")
const webpack = require("webpack")
//使用前别忘了install
const webpackDevMiddleware = require("webpack-dev-middleware")
const webpackConfig = require('./webpack.config.js') const app = express(),
DIST_DIR = path.join(__dirname, "dist"),
PORT = 9090,
complier = webpack(webpackConfig) app.use(webpackDevMiddleware(complier, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})) app.get("*", (req, res, next) =>{
const filename = path.join(DIST_DIR, 'index.html'); complier.outputFileSystem.readFile(filename, (err, result) =>{
if(err){
return(next(err))
}
res.set('content-type', 'text/html')
res.send(result)
res.end()
})
}) app.listen(PORT)
complier = webpack(webpackConfig)会创建一个用来传给webpack-middle-ware的对象,同时我们还可以给他webpack-middle-ware传一些option,比较重要的是这个publicPath, 这个是必传的参数,通常是和你的webpack.config.js
里的publicPath是一致的,然后通过
app.get("*", (req, res, next) =>{
const filename = path.join(DIST_DIR, 'index.html'); complier.outputFileSystem.readFile(filename, (err, result) =>{
if(err){
return(next(err))
}
res.set('content-type', 'text/html')
res.send(result)
res.end()
})
})

这段代码来告诉express去读取文件,这里我并没有直接使用下面这种方式:

app.get("*", (req, res) => {
res.sendFile(path.join(DIST_DIR, "index.html"));
});

这样直接发送文件,因为所有的文件是在内存中的,我们直接去目录里去读是不对的,所以采用上面的方式手动指定文件的加载目录在哪里。

Hot Module Replacement

  现在我们已经集成了webpack-dev-middleware,使用这个插件很简单,在webpack.config.js里的入口和插件里进行相应修改:

...
entry: ["webpack-hot-middleware/client", "./main"],
...
plugins: [
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
]

修改entry的原因是我们要配置当文件更新时通知服务器:

  然后接下来在Express里配置使用webpack-hot-middleware

import webpackHotMiddleware from "webpack-hot-middleware";
...
app.use(webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath
}));
...
app.use(webpackHotMiddleware(compiler));

到这里就已经配置好了,在package.json里添加一个脚本:

"start": "node dev-server.js"

但是事实上这时候你运行npm start 的时候并不能实时刷新,因为

  

只有接受更新的module才会被热更新过,我们需要所有的文件都热更新,所以在入口文件(我的是./js/page/index.js)里面加上:

if (module.hot) {
module.hot.accept();
}

这时候就可以实时刷新了。

坑:

  当你使用ExtractTextPlugin时,因为这个插件本身的原因,修改css文件是不会更新的,所以在dev的时候可以不使用这个插件。

注:本文出自博客园 https://home.cnblogs.com/u/mdengcc/ ,转载请注明出处。

使用webpack-dev-middleware 和 webpack-hot-middleware 配置一个dev-server的更多相关文章

  1. 分离Webpack开发环境与生产环境的配置

    这是Webpack+React系列配置过程记录的第五篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  2. webpack 开发环境与生成环境的 配置

    写在前面 最近学习react,之前做vue项目的时候,一直都是拿来主义,浑浑噩噩,感觉不太好,趁学习react的机会,在顺带学习一下webpack.一般配置文件分两份,为开发环境和生成环境.有此区分, ...

  3. 记webpack下进行普通模块化开发基础配置(自动打包生成html、多入口多页面)

    写本记时(2018-06-25)的各版本 "webpack": "^4.6.0"  //可直接使用4x以上的开发模式,刷新很快 "webpack-de ...

  4. VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址

    转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...

  5. [Webpack] Configure Prepack with Webpack

    Great improvements and optimizations can be made to the output of bundled code. Prepack provides the ...

  6. Webpack的使用指南-Webpack的常用解决方案

    说是解决方案实际上更像是webpack的插件索引. 写这一篇的目的是为了形成一个所以,将来要用时直接来查找即可. 1.自动构建HTML,可压缩空格,可给引用的js加版本号或随机数:html-webpa ...

  7. 带你走进webpack世界,成为webpack头号玩家。

    最近朋友圈被<头号玩家>刷爆了,斯皮尔伯格一个资深电影导演,把对过去经典的致敬,对未来的憧憬浓缩在这一部电影中,可以说让观众燃了起来. 观望整个前端开发,不断的演化,发展迅速.前端开发从最 ...

  8. 第四十八篇:webpack的基本使用(二) --安装和配置webpack-dev-server插件

    好家伙, 1.webpack中的默认约定 默认的打包入口文件为src  -->index.js 默认的输出文件路径为dist -->main.js 既然有默认,那么就说明肯定能改 2.en ...

  9. 第四十七篇:webpack的基本使用(一) --安装和配置webpack

    好家伙, 1.webpack的基本使用 写个例子:实现一个奇偶行变色列表 步骤如下: ① 新建项目空白目录,并运行 npm init-y命令,初始化包管理配置文件 package.json② 新建sr ...

  10. [Webpack] Use the Webpack Dashboard to Monitor Webpack Operations

    Learn how to use the new Webpack Dashboard from Formidable Labs to display a pretty, useful output f ...

随机推荐

  1. Ambari架构原理

    不多说,直接上干货! Ambari 架构原理图 通过三张图来说明: 第一张架构图告诉我们:Ambari是Hortonworks贡献给社区的.完全开源的.Hadoop生态的集群管理.监控.部署的工具: ...

  2. 如何更换git托管

    有时候会遇到需要更换代码托管平台,从github,gitlab或者Bitbucket迁移到其它平台,过程中可能遇到不少问题,本文从是否保留历史提交记录两种需求出发,介绍一下基于git托管平台的迁移方法 ...

  3. Excel 一键上传到数据库

    <a class="edit"  id="batchImport">   批量导入  </a> js代码弹窗: $("#bat ...

  4. 智慧航空AI大赛-阿里云算法大赛总结 第一赛季总结

    [以前的文章]最后一公里极速配送 - 阿里云算法大赛总结 总结一下新的教训 1.由于都是NP难题,获得最优解用常规的方法非常困难,对于不是算法科班出身的人来说,首先应该到网络上寻找一下论文,是否有一些 ...

  5. pygal的简单使用

    pygal的简单使用 例子来自此书: <Python编程从入门到实战>[美]Eric Matthes pygal是一个SVG图表库.SVG是一种矢量图格式.全称Scalable Vecto ...

  6. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  7. Node.js原生及Express方法实现注册登录原理

    由于本文只是实现其原理,所以没有使用数据库,只是在js里面模拟数据库,当然是种中还是需要用数据库的. 1.node.js原生方法 ①html页面,非常简单,没有一丝美化~我们叫它user.html & ...

  8. 移动Web学习笔记(第1天)-bootstrap框架的使用

    移动web前言 移动web : 移动端手机浏览器或者微信里面浏览的网页 移动APP : 手机上需要下载安装的应用程序 1. 移动web介绍 1.1 3 天 响应式开发 一套代码运行多个终端 优点:开发 ...

  9. SQL Server数据库基础笔记

    启动和停止SQL Server服务三种形式 后台启动服务 计算机->右键->管理->服务和应用程序->服务->sql server(MSSQLSERVER) SQL Se ...

  10. 从Javascript单线程谈Event Loop

    假如面试回答js的运行机制时,你可能说出这么一段话:"Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后 ...