Webpack 4教程 - 第六部分 增强开发时体验

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
原文出处: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的一些作用。我们还学习使用了模块的热替换。所有这些组合起来,能帮你更容易和更快地开发应用。  

原文地址:https://www.cnblogs.com/powertoolsteam/p/10536629.html

时间: 2024-10-30 03:00:34

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

Webpack入门教程十六

84.HtmlWebpackPlugin的chunks的配置,webpack.config.js文件修改如下 var webpack = require('webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry:{ 'Greeter':__dirname + "/app/Greeter.js", 'a':__dirname + "/app/a.js&

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

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己家的设备,在没有统一的标准前提下,就会有各种集成数据的格式.为了满足此类的场景,为设备输出数据专门设计了接口,开发者可以继承该接口,设备在处理完数据后,会把数据自动传输到该接口,可以按规定的数据格式进行输出了. 1.2    接口功能说明 开发设备输出接口,主要考虑到在集成项目中,集成过程中或被集成

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

转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接 ).但是遗留了两个问题.1.还是无法卸载:2.必须手动去点击应用程序进入程序,再点击按钮,这显得很麻烦. 这一篇就解决上面两个问题,做出最好的效果. 首先解决无法卸载问题: 在清单文件

微信公众平台开发教程(六)获取个性二维码

微信公众平台开发教程(六)获取个性二维码 一.功能介绍 在进行推广时,我们可以告诉对方,我们的微信公众账号是什么,客户可以去搜索,然后关注.二维码给我们提供了极大的便捷,只要简单一扫描,即可关注. 如果已经关注过,立刻跳入对话画面.在我们进行推广时,不再是简陋的文字,可以是一个有个性的二维码,想必会很生动. 微信对二维码提供了很好的支持,而且还可以根据需要生成不同场景的二维码.下面我们将介绍如何获取和使用二维码. 注意:限服务号,且进行了微信认证,费用300 二.相关接口 为了满足用户渠道推广分

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

学习webpack,基本始终是围绕: 1.如何安装webpack 2.如何使用webpack 3.如何使用loader 4.如何使用开发服务器 可能我们会在如何使用开发服务器的时候,遇到诸如调试的相关问题: 使用开发服务器 我们webpack中使用的开发调试服务器通常是 webpack-dev-server,通过这个服务我们更多的是想实现无刷新的处理编译入口文件. 通过以下命令全局安装 1 npm install webpack-dev-server -g 启动服务器 1 webpack-dev

webpack入门级教程

首先可以看下官方文档,文档是最好的老师. 这里也有国外的一个朋友写的入门介绍. Webpack是由Tobias Koppers开发的一个开源前端模块构建工具.它的基本功能是将以模块格式书写的多个JavaScript文件打包成一个文件,同时支持CommonJS和AMD格式.但让它与众不同的是,它提供了强大的loader API来定义对不同文件格式的预处理逻辑,从而让我们可以将CSS.模板,甚至是自定义的文件格式当做JavaScript模块来使用.Webpack 基于loader还可以实现大量高级功

Quick-Cocos2d-x初学者游戏教程(六) --------------------- 游戏逻辑

Quick-Cocos2d-x初学者游戏教程(六) 上一章我 们介绍了开发中会用到的辅助工具,并创建了 GameScene 场景,接下来这章我们将继续 GameScene 的传(bai)奇(bi).不过在开始编写 GameScene 场景的代码之前,我们还是先来明确一下游戏的功能和实现方法.这样可以帮我们更好的理解并设计逻辑.下面是总结出的结论: 在 GameScene 场景中,我们将创建一个飞行的娃娃角色,这个角色是游戏的唯一主角.游戏初始状态下,这个角色有满满的生命值,但随着时间的推移,生命

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

无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distribution;layout] 对事物的全面规划和安排,布:陈设:设置. 我对布局理解是“把**东西放在**位置显示”[动词]. ok,我们这节课就讲一下怎么样把 ExtJs 的组件,放到我们想放置的位置. 一.常用布局 (1)ContainerLayout:默认布局方式,其他布局继承该类进行扩展功能.显示:

Android 适配器教程 (六)

我们的适配器学习已经接近尾声了,虽然这不是一个大问题,但是确实是值得学习的一块知识,回想一下之前五讲的知识,我们已经学到了很多东西了. 在之前五讲中,我们已经由浅入深的认识了适配器,从最简单的ListView写起,最后完成了自定义适配器的简单例子,然后又为大家讲解了ViewHolder和settag在自定义适配器中的应用,帮助大家理解了getView方法,还讲解了关于ListView性能方面的优化问题.自定义适配器这一部分是我们这次学习真正的重点,很多问题可以用安卓原生适配器进行解决,但是也有很