转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
原文出处:https://wanago.io/2018/08/06/webpack-4-course-part-six-increasing-development-experience

今天我们将介绍mode属性的development值。它会自动为你配置Webpack以简化开发过程。除此之外,我们还会介绍webpack-dev-server——包括模块热替换。开始吧!

开发体验优化的其中一步是让Webpack运行在watch模式下。试试webpack --watch。现在每当你对源码做出修改,Webpack会重新编译你的工程然后输出。webpack-dev-server则做得更多。它不是把输出文件写到文件夹下,而是直接把它们写入内存。在构建完之后,输出可作为本地服务器资源被访问。

运行 webpack-dev-server

首先是安装它。

npm install webpack-dev-server

然后是在你的package.json文件中加入它:

"scripts": {
"build": "webpack",
"start": "webpack-dev-server"
}
··· 现在就可以使用`npm start`来启动它。你会看到下面的提示信息:
```bash
「wds」: Project is running at http://localhost:8080/

剩下的事情只是在浏览器中打开http://localhost:8080/了。

模块热替换

为进一步优化你的开发体验,可以使用模块热替换,你甚至跳过刷页面的需求。比如,当你对某些样式做了修改,不必刷新整个页面就可以看到效果。

第四节教程我们曾使用了MiniCssExtractPlugin。请注意,在写文本时,对MiniCssExtractPlugin的热模块更新支持还没有实现。更多信息请可查看Github上的此issue。在当前开发环境,你可能需要使用的是style-loader。

当你运行webpack-dev-server时,它使用与正常构建时相同的配置文件。你可以在webpack.config.js中加入一个叫devServer的参数来进行额外的配置。我们需要它来开启模块热替换。  

// webpack.config.js
const webpack = require('webpack'); module.exports = {
devServer: {
hot: true
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
};

注意,当开启 -hot 标志以运行 webpack-dev-server 时也会在plugins里加入HotModuleReplacementPlugin。如果你添加了两次,可能会出现问题。

这对于我们的CSS调试是很有吸引力的。但当修改是JavaScript时,还需点额外步骤。

// index.js
import { divide } from "./divide"; console.log(`6 / 2 = ${divide(6,2)}`); if(module.hot) {
module.hot.accept();
}
// divide.js
export function divide(a, b) {
return a / b;
}

运行module.hot.accept()会让模块可热替换。这同样适用于它引入的所有其他模块。上面的代码意味着,index.js中的accept()让divide模块能够被热替换。

运行module.hot.accept()函数时可以传参,如果你感兴趣,请查看文档

当使用HotModuleReplacementPlugin插件时,如果输出文件名中使用了chunkhash字段,就可能会出现一些问题。这种情况下,只在开发环境下使用HotModuleReplacementPlugin是个好主意(而且避免使用chunckhash)。

// webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const isDevServer = require.main.filename.includes('webpack-dev-server');
const plugins = [
new HtmlWebpackPlugin({ template: './src/index.html' }),
];
if(isDevServer) {
plugins.push(new webpack.HotModuleReplacementPlugin());
} module.exports = {
output: {
filename: isDevServer ? '[name].bundle.js' : '[name].[chunkhash].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins,
devServer: {
hot: true
}
}

webpack-serve

译者注:由于webpack-serve其实已经不再维护了。推荐仍然使用上面所说的webpack-dev-sever。

mode: "development"

之前的课程,我们介绍了mode属性的production值。现在该轮到development了。让我们看看它为我们做了我们。

DefinePlugin

如之前所说,这个插件允许你创建编译时的全局常量。

因为这个插件也在mode: produnction中使用,更多信息可查看教程的第五部分

这次它的值为process.env.NODE_ENV: JSON。stringify("development"):

module.exports = {
mode: "development",
// 使用 mode: "development" 会添加以下配置:
plugins: [
new webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify("development")
}),
]
}

NamedModulesPlugin

这是在使用mode: "development"时默认加入的另一个插件。它在使用模块热替换时很有用。有了NamedModulesPlugin,我们能够看到被替换模块的相对路径。  

[WDS] App updated. Recompiling...
[WDS] App hot update...
[HMR] Checking for updates on the server...
[HMR] Updated modules:
[HMR] - ./src/style.css
[HMR] App is up to date

否则我们只会看到一个id,而不是像./src/style.css这样的路径。

NamedChunksPlugin

它的左右和NamedModulesPlugin类似。有了它,不仅模块能看到名字,chunk也能。当应用在浏览器中运行起来是,你可以在window.webpackJsonp属性中查看它们。

使用NamedModulesPluginNamedChunksPlugin的一个额外好处是,当添加和删除依赖时,打包不再需要使用模块的顺序id。因为这些id和名字会在最终的输出产物中使用,修改它们会导致文件哈希值的变化,即使这些文件使用的模块本身并没有改变。使用以上两个插件会帮助你处理浏览器的缓存问题。让我们来比较一下代码:

没使用NamedModulesPluginNamedChunksPlugin

// 输出产物
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
/***/ 6:
(...) // divide.js module output code /***/ 7:
(...) // substract.js module output code
]);

使用了NamedModulesPluginNamedChunksPlugin

(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["utilities~main"],{
/***/ "./src/utilities/divide.js":
(...) // divide.js module output code /***/ "./src/utilities/substract.js":
(...) // substract.js module output code
]);

Devtool

除了添加插件,设置mode: "development"还做了一件事,即通过设置devtool的值为eval开启了源码映射(Source Map)。  

// webpack.config.js
module.exports = {
mode: "development",
// 使用 mode: "development:" 添加了以下配置
devtool: "eval"
}

转译、压缩和打包你的代码能让你的用户有更好的体验。经过这些步骤之后,代码变得更精简和高效。而调试这样的代码则变得非常困难。因此,引入了源码映射(Source Map)。它们把输出后的的代码与源码对应起来。有了它,相对于浏览器真正运行的打包后的输出,你能看到其对应的源码,从而更加容易地使用调试工具和设置断点。我们会在接下来的课程中对源码映射做进一步介绍,但如果你需要现在就定制它,可查看它的文档。  

总结

Webpack是开发现代Web应用的强大工具。它不仅让你优化生产环境的代码,而且还可以并定制,用以增强开发时的体验。这次我们介绍了如何运行开发时服务器,以及把mode属性设成development的一些作用。我们还学习使用了模块的热替换。所有这些组合起来,能帮你更容易和更快地开发应用。  

Webpack 4教程 - 第六部分 增强开发时体验的更多相关文章

  1. 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己 ...

  2. Android简易实战教程--第六话《开发一键锁屏应用2·完成》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...

  4. iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面

    iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main. ...

  5. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  6. 全网最贴心webpack系列教程和配套代码

    webpack-demos:全网最贴心 webpack 系列教程和配套代码 欢迎关注个人技术博客:godbmw.com.每周 1 篇原创技术分享!开源教程(webpack.设计模式).面试刷题(偏前端 ...

  7. webpack 使用教程--实时刷新测试

    学习webpack,基本始终是围绕: 1.如何安装webpack 2.如何使用webpack 3.如何使用loader 4.如何使用开发服务器 可能我们会在如何使用开发服务器的时候,遇到诸如调试的相关 ...

  8. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  9. webpack入门级教程

    Webpack是什么 首先可以看下官方文档,文档是最好的老师. 这里也有国外的一个朋友写的入门介绍. Webpack是由Tobias Koppers开发的一个开源前端模块构建工具.它的基本功能是将以模 ...

随机推荐

  1. Java:基于MD5的文件监听程序

    前述和需求说明 和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的.代码已上传Gi ...

  2. Redis - NoSQL数据库技术(一)

    NoSQL入门概述(一) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 什么是NoSQL NoSQL(NoSQL - Not Only SQL),意“不仅仅是SQL”: 泛指非关系 ...

  3. 使用Git过程中经常会遇到的问题

    目录 git pull如何强制覆盖本地文件 Git如何同时删除本地分支和远程分支 Git如何撤销最近一次提交 Git撤销本地的最后一次提交 Git撤销最近一次远程提交 如何修改提交信息和文件 修改本地 ...

  4. .Net 反射学习

    Why?为什么使用反射 MVC ORM EF 都是用的反射.反射可以让程序的扩展性,灵活性得到加强.一起即可动态创建   what 反射原理    动态加载类库 ,先添加引用类库,或者复制debug里 ...

  5. easyui表格自动换行

    表格内容自动换行可以通过设计表格属性  nowrap:false来实现,默认值为true: 但是easyui并未提供,表头自动换行的解决方案,因为一般我们的数据表格列名都是固定的,想换行的话可以通过& ...

  6. UiPath针对SAP的输入技巧

    我观察到在SAP中不论是SimulateType,还是SendWindowMessages,Type Into的输入速度都很慢(是逐个字符输入的).如果只是一次两次的输入倒也没什么,但如果是需要批量多 ...

  7. 将包含经纬度点位信息的Excel表格数据导入到ArcMap中并输出成shapefile

    将包含经纬信息的Excel表格数据,导入到ArcMap中并输出成shapefile,再进行后面的操作.使用这种方法可以将每一个包含经纬信息的数据在ArcMap中点出来. 一.准备数据 新建Excel表 ...

  8. 记录SoapUI使用说明

    一.SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到E ...

  9. Mysql B+Tree原理

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  10. 使用 Node.js 搭建 Web 服务器

    使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块.文件系统.url解析模块.路径解析模块.以及301重定向技术等, ...