webpack4.29.x成神之路(九) webpack-dev-server上

栏目: 编程语言 · 发布时间: 4年前

内容简介:上节:首先删除bundles, 删完后目录如下:

目录

上节: 使用loader之打包样式下

首先删除bundles, 删完后目录如下:

webpack4.29.x成神之路(九) webpack-dev-server上

之前每次都要 npm run build后才能看打包后的效果,在开发阶段是不可能这么干地,我们需要一个能使代码及时生效的功能。

webpack自带的webpack-dev-server 为你提供了一个简单的 web 服务器,并且能够实时重新加载

基本使用

修改配置:

webpack.config.js:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[contenthash:8].js',
    path: resolve(__dirname, 'bundles')
  },

  // 开启devServer
  devServer: {},

  module: {
    rules: [{
      test: /\.(gif|jpg|jpeg|png|svg)$/,
      use: ['url-loader']
    }, {
      test: /\.less$/,
      use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
    }]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './index.html'
    }),
    new CleanWebpackPlugin()
  ]
};

src/index.js:

import './styles/index.less'
window.addEventListener('DOMContentLoaded', function() {
  const root = document.getElementById('root');
  root.innerText = _.join(['hellow', 'webpack'], '~');
});

src/styles/index.less:

#root{
  color: blue;
}

修改package.json的script对象:

// 省略
"scripts": {
    "dev": "webpack-dev-server",
    "build": "webpack"
  },
// 省略

webpack-dev-server和webpack都会默认读取根目录下的webpack.config.js

安装依赖:npm i webpack-dev-server -D

装完后执行npm run dev,就会开启一个node服务:

webpack4.29.x成神之路(九) webpack-dev-server上

浏览器访问: http:localhost :8080, 应出现如下页面:

webpack4.29.x成神之路(九) webpack-dev-server上

这时每次修改src/index.js,浏览器就会自动刷新咯。

热模块更新

现在修改代码后,浏览器会有一个刷新的动作,如果想达到无刷新的效果,需要配置写选项

webpack.config.js:

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const webpack = require('webpack');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: '[name].[hash:8].js',
    path: resolve(__dirname, 'bundles')
  },

  // 开启devServer
  devServer: {
    hot: true,
    
    // 可选,即使代码没生效,也不刷新浏览器
    hotOnly: true
  },

  module: {
    rules: [{
      test: /\.(gif|jpg|jpeg|png|svg)$/,
      use: ['url-loader']
    }, {
      test: /\.less$/,
      use: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
    }]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './index.html'
    }),
    new CleanWebpackPlugin(),
    new webpack.HotModuleReplacementPlugin()
  ]
};

这时重新执行 npm run dev, 打开浏览器, 字体颜色应该是蓝的,这时随便换个颜色,浏览器就能无刷新生效了。

但是有个问题,如果改变src/index.js的代码,浏览器不会有任何反应,原因是开启了hotOnly,如果把hotOnly去掉

devServer: {
    hot: true
  }

这时改index.less没问题,但是改index.js,浏览器还是会刷新一下,这说明改js并未实现热更新效果。

继续改代码,在src下新建js目录,并新建counter.js和number.js

src/js/counter.js:

let num = 1;
export default function counter() {
  const div = document.createElement('div');
  div.setAttribute('id', 'counter');
  div.innerText = num;
  div.onclick = function () {
    div.innerText = ++num;
  }
  document.body.appendChild(div);
}

src/js/number.js:

export default function number() {
  const div = document.createElement('div');
  div.setAttribute('id', 'number');
  div.innerText = 1000;
  document.body.appendChild(div);
}

src/index.js:

import counter from './js/counter';
import number from './js/number';
counter();
number();

然后浏览器运行如图:

webpack4.29.x成神之路(九) webpack-dev-server上

随机点击数次数字1后如图:

webpack4.29.x成神之路(九) webpack-dev-server上

此时是13和1000,然后改变number.js里的1000,在看浏览器:

webpack4.29.x成神之路(九) webpack-dev-server上

浏览器会刷新一下,1000变成了3000,但是13也重置成了1

我们的想法是,当我们改变number.js文件时,页面上只改变number.js那部分内容,其它地方保持原样,比如保持13,这时就需要再做点事情

src/index.js:

import counter from './js/counter';
import number from './js/number';
counter();
number();
 if (module.hot) {  // 如果开启了热更新
     module.hot.accept('./js/number', function() {
      // ./js/number变化时执行
     console.log('number updated!');
     document.body.removeChild(document.getElementById('number'));
     number();
    })
 }

这时在此点击几次数字1:

比如页面上是:6和3000

webpack4.29.x成神之路(九) webpack-dev-server上

再来改变number.js,把3000改成1000,观察浏览器:

此时浏览器没有刷新,单页面已经发生变化,3000变成了1000,并且上面那个数字还是6

这里就有个问题了,为啥之前改less时hmr能直接生效,改js就要自己手动写一坨逻辑呢?

那是因为style-loader底层已经帮我们写好了这种逻辑。

下节:webpack-dev-server下(待更新)


以上所述就是小编给大家介绍的《webpack4.29.x成神之路(九) webpack-dev-server上》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript核心技术

JavaScript核心技术

Shelley Powers / 苏敬凯 / 机械工业出版社 / 2007-6 / 45.00

Ajax是当今Web开发领域最流行的词汇。而JavaScript与CSS、XML和DOM几种老技术,加上XMLHttpRequest就构成了Ajax的四大基石。对于JavaScript,一些更资深的同事告诉我的感觉是失望。面对不同的浏览器和浏览器的不同版本,没有优秀的调试开发工具,JavaScript成了软件开发的泥潭。. 而本书的出版则给我们增加了一丝解决这些问题的信心。 它从最简单......一起来看看 《JavaScript核心技术》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试