从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用

sourceMap

实际应用开发过程中大部分时间都是处于开发模式中,其中需要频繁的修改代码、调试和打包。

但是打包后的代码多个模块压缩到了一个bundle文件,如果出现警告或者异常很难定位到具体模块和位置,所以webpack提供了source map的配置 devtool
该配置可选且具有多个配置项 ,具体包含以下:

devtool 构建速度 重新构建速度 生产环境 品质(quality)
(none) +++ +++ yes 打包后的代码
eval +++ +++ no 生成后的代码
cheap-eval-source-map + ++ no 转换过的代码(仅限行)
cheap-module-eval-source-map o ++ no 原始源代码(仅限行)
eval-source-map -- + no 原始源代码
cheap-source-map + o yes 转换过的代码(仅限行)
cheap-module-source-map o - yes 原始源代码(仅限行)
inline-cheap-source-map + o no 转换过的代码(仅限行)
inline-cheap-module-source-map o - no 原始源代码(仅限行)
source-map -- -- yes 原始源代码
inline-source-map -- -- no 原始源代码
hidden-source-map -- -- yes 原始源代码
nosources-source-map -- -- yes 无源代码内容

+++ 非常快速, ++ 快速, + 比较快, o 中等, - 比较慢, -- 慢

其中 evaleval-source-mapcheap-eval-source-mapheap-module-eval-source-map,比较适合开发环境。

更详细的信息可以查看devtool的文档

这里在原先的配置文档上添加devtool配置 devtool: ‘cheap-eval-source-map‘,

webpack-dev-server

webpack-dev-server 可以提供一个简单的 web server,并且具有 live reloading(实时重新加载) 功能。 该工具并非webpack内置,所以需要额外安装。

yarn add webpack-dev-server --dev

安装完成后在package.json文件的script中添加以下启动方式,--open意思是启动后打开浏览器

"start": "webpack-dev-server --open"

然后可以在命令行中执行 npm run start 或者 yarn start
可以看到webpack-dev-server 在8080(默认)端口启动了一个服务。并且有一个websocket链接。这时候模块内容变更,devServer服务器就会通过websocket通知浏览器进行刷新。

此时模块都会打包到内存中,并未输出到硬盘中。

可以在webpack的配置文件中添加devServer选项配置devServer

devServer: {
  // contentBase: './dist', //设置该值,devServer会到目标目录读取文件而不会打包到内存中
  port: 8080 // 指定端口号,默认8080
  compress: true // 一切服务都启用 gzip 压缩
  proxy: {
    '/api': 'http://localhost:3000'
  }  //接口代理,比如以上配置会将/api的接口都代理到 http://localhost:3000/api
}

详细配置可以查看 devServer

热更替

模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新。改模式仅适用于开发模式 mode: development

要想使用模块热更替,需要借助webpack内置的HotModuleReplacementPlugin

const webpack = require('webpack')
devServer:{}
plugins: [
  derServer: {
    hot: true,
  },
  new webpack.HotModuleReplacementPlugin(),
]

接着在src目录下新建一个print.js文件,导出一个print函数

src/print.js

export default function pring(){
  console.log('log A')
}

在index.js中引入print.js,并且在底部添加部分代码

import _ from 'lodash'
import print from './print' 

import './style.css'
import ImgFile from './asset/tim.jpg'

function createComponent(tag) {
  let element = document.createElement(tag)

  element.innerHTML = _.join(['Hello', 'webpack'], ', ')
  element.classList.add('red')

  let img = new Image()
  img.src = ImgFile

  element.append(img)

  print() //log something

  return element
}

document.body.append(createComponent('div'))

if(module.hot){
  module.hot.accept('./print.js', function(){
    print()
    console.log('模块热更新啦!')
  })
}

完成以上工作后重启devServer服务器。
查看浏览器控制台可以看到 print打印的信息log A以及热更替启用的信息

这时候修改print.js,添加多一条打印信息

export default function pring(){
  console.log('log A')
  console.log('log B')
}

以上就完成了热更新的基本配置。

但是还有个问题,就是修改index.js的内容时不会触发热更新。
这是因为在这段代码中的module.hot.accept函数第一个参数 接收的是./print.js文件的绝对路径,如果热更替的时候只会执行print的模块代码。

一般这种情况的解决方案是把应用的入口逻辑放到另外一个app.js模块文件中,然后在index.js中引入该模块,重新执行该模块的代码。

PS: css文件的热更替使用style-loader。

对于 React 和 Vue 可以使用

React Hot Loader

Vue Loader

完整的webpack.config.js 文件

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
  entry: {
    app: path.resolve(__dirname, './src/index.js')
  },
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  devtool: 'cheap-eval-source-map',
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader'
        ]
      },
      {
        test: /\.(jpg|jpeg|png|bmp)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: 'img/[name].[ext]'
            }
          }
        ]
      }
    ]
  },
  devServer: {
    hot: true,
  },
  plugins: [
    new HtmlWebpackPlugin(),
    new MiniCssExtractPlugin({
      filename: 'css/style.css'
    }),
    new CleanWebpackPlugin()
  ]
}

原文地址:https://www.cnblogs.com/zzy1996/p/11605690.html

时间: 2024-10-16 23:42:38

从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用的相关文章

BizTalk开发系列(三) 单机环境下的BizTalk Server 2006 R2安装

大部分的开发环境都是在单机环境下进行的,今天整理了一下BizTalk Server 2006 R2在单机环境下的安装步骤. 1. 软件需求 在独立服务器中完整安装BizTalk Server 2006 R2的基本软件需求 Windows 2003 Server with Service Pack 2 (SP2), or Windows 2003 Server R2 Microsoft Office Excel 2003 and InfoPath 2003 with Service Pack 2

[.net 面向对象程序设计深入](5).NET MVC 6.0 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux)

[.net 面向对象程序设计深入](5).NET MVC 6.0 —— 构建跨平台.NET开发环境(Windows/Mac OS X/Linux) 1.关于跨平台 上篇中介绍了MVC的发展历程,说到.NET 5.0之后更名为 Core 1.0,同样MVC 6.0也是运行在Core 1.0(.NET 5.0)之下. 我们要进行开发和部署基于MVC 6.0的项目,首先要搭建他的开发环境. Core 1.0 是一个支持跨平台框架,下面分别介绍如何在Windows/Mac Os X/Linux下搭建开发

Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核>,已经实现了通过u-boot加载Kernel启动开发板,并且挂载根文件系统,本文讲述通过NFS网络挂载根文件系统. 通过NFS网络根文件系统,可以实现开发板在通过u-boot启动内核后,通过NFS网络在别的PC主机上挂载根文件系统.对于开发调试阶段的工作学习提供

构建ubuntu下的JXTA-C开发环境

概述: 因为网络上关于这个JXTA-C源码编译的文章较少,所以我在此首先写一份编译的完整过程,以供网友们参考. JXTA-C源码所在地址:http://download.java.net/jxta/ 1.操作系统环境 [email protected]:~$ cat /etc/issue Ubuntu 12.04.4 LTS \n \l [email protected]:~$ file /bin/ls /bin/ls: ELF 32-bit LSB executable, Intel 8038

快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是Windows,装虚拟机也麻烦,所以还不如30块钱 买个腾讯云,用putty远程练上去写代码呢. 我一直都是putty+VIM在Linux下开发代码,好几年了,只要把putty和VIM配置好,其实 开发效率挺高的. 买好腾讯云后,装个Centos,会分配个外网IP,然后买个域名,在DNSPod解析过去

安卓开发基础知识0(五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程)

需求说明:安卓开发 内容       :安卓开发所需的环境搭建 来自       :时间的诗 原文:http://www.cnblogs.com/zoupeiyang/p/4034517.html 参考:http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html 引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为

Wince6.0应用开发:三、小技巧揭秘

在Wince6.0的应用开发过程中,掌握一些使用的小技巧,必定会事半功倍 那么,你做好心里准备了吗?3.2.1. 技巧一:我会告诉你你为Wince开发的程序可以在你的电脑上运行!                     这个技巧的用途有两个 1.测试程序能否达到预期效果 还记得我们上一篇帖子在模拟上用的小程序吗? 我们现在PC上运行一下 2.捕捉在Wince上不显示的异常 有时候,在Wince上运行应用程序,即使出错了也不会抛出异常,当这个时候我们只需要在电脑上运行程序便会捕捉到程序的异常,这对

Cocos2d-x 3.0游戏开发之虚拟机IOS环境:匹配才是好,莫要随便升级软件

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/34110449 做为一个买不起MAC的Coder,只好使用虚拟机. 前不久,重装了系统,又把虚拟机升级到了10.0... 然后启动MAC,一直失败,不知道什么原因... 有砸电脑的冲动了... 忽然, 灵思一动, 卸载了10.0,回归到VMware8.0, 再次启动MAC, 柳暗花明... 至今原因未知, 又想起了,几年前就因为升级遇到的各种坎坷, 特

一个十分简单的、关于生产环境和开发环境的webpack配置

关于这个开发环境和生产环境的配置代码,之所有要分开是因为他们有些代码相同,有的又不同. 例如:开发模式下需要启动本地服务器,需要热重载,而生产模式不需要这些需要代码压缩.DefinePlugin等. 我们都是将两种环境都用用到的提取出来,放在一个公共.js文件.然后在相应的环境配置中使用  webpack-merge  将公共js合并进来. 我所了解到的配置思路,有两种: 方法一: 使用webpack-dev-server配置开发环境(这个简洁一些): 方法二: 使用webpack-dev-mi