博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webpack小白入门之文件监听,热更新,文件指纹,代码压缩【1-4】
阅读量:5014 次
发布时间:2019-06-12

本文共 5288 字,大约阅读时间需要 17 分钟。

webpack中的文件监听

文件监听是在发现源码发生变化的时候,自动重新构建出新的输出文件。

webpack开启监听模式的两种模式:

  • 启动 webpack 命令时候,带上 --watch 参数

package.json中配置如下:

"scripts": {    "build": "webpack --watch"},复制代码

上面方式有个缺陷,就是每次webpack更新代码,都要手动刷新浏览器!

  • 在配置 webpack.config.js 中设置 watch:true

通过轮询判断文件的最后编辑时间,是否发生变化,当某个文件发生变化,并不会立即告诉监听者,而是先缓存起来,等aggregateTimeout。

module.exports = {  // 默认是false ,不开启状态  watch: true,  // 只有开启监听模式watchOptions才有意义  watchOptions: {    // 不监听的文件或者文件夹,默认为空,支持正则匹配。    ignored: /node_modules/,    // 监听到变化发生后,会等300ms再去执行更新,默认是300ms     aggregateTimeout: 300,    // 判断文件是否发生变化,是通过不停的询问系统指定文件有没有发生变化实现的,默认每秒问1000次。    poll: 1000  },}	复制代码

webpack中的热更新:webpack-dev-server及其原理

首先安装: npm i webpack-dev-server -D

package.json 中配置如下:

"scripts": {    "dev": "webpack-dev-server --open"   },复制代码

webpack.config.js中配置:

const webpack = require('webpack');module.exports = {	 mode: 'development',   // 开发环境	 plugins: [	    // webpack 自带的热更新插件	    new webpack.HotModuleReplacementPlugin()	  ],	  devServer: {	    contentBase: './dist',  // webpack服务的基础目录	    hot: true	  }}复制代码

webpack中的热更新:webpack-dev-middleware(WDM)及其原理。

WDM将webpack输出的文件传输服务器,适用于灵活的应用场景。

const express = require('express'); const webpack = require('webpack'); const webpackDevMiddleware = require('webpack-devmiddleware');const app = express(); const config = require('./webpack.config.js'); const compiler = webpack(config);app.use(webpackDevMiddleware(compiler, { publicPath: config.output.publicPath}));app.listen(3000, function () { console.log('Example app listening on port 3000!\n');});复制代码

原理分析

webpack compile: 将js编译成,bundle.js

HMR Server:将热更新的文件输出给 HMR Runtime

Bundle server: 提供文件在浏览器的访问

HMR runtime: 会被注入到浏览器,更新文件的变化。

bundle.js:构建输出的文件

原理图如下所示:

文件指纹策略

打包后输出的文件名的后缀

文件指纹如何生成?

  • hash:整个项目的构建相关,只要项目文件有修改,整个项目的构建的hash就会改变。
  • Chunkhash:和webpack打包的chunk有关,不同的entry会生成不同的chunkhash值。
  • contenthash:根据文件内容来定义hash,文件内容不变,则contenthash不变。

js的文件指纹的设置

设置 output 的 filename,使用 [chunkhash]

module.exports = {	output: {		filename: '[name]_[chunkhash:8].js',		path: path.join(__dirname, 'dist')	},}复制代码

css的文件指纹的设置

设置MiniCssExtractPlugin的filename,使用[contenthash]

占位符名称 含义
[ext] 资源后缀名
[name] 文件名称
[path] 文件的相对路径
[folder] 文件所在的文件夹
[contenthash] 文件的内容hash,默认是md5生成
[hash] 文件的内容hash,默认是md5生成
[emoji] 一个随机的指代文件内容的emoji

首先安装插件 npm install mini-css-extract-plugin -D

在新建的 webpack.prod.js文件中配置:

module: {    rules: [      {        test: /\.js$/,     // 匹配js文件        use: 'babel-loader' // 用于将ES6等高级语法解析成ES5语法      },      {        test: /\.css$/,        use: [ // 注意 解析顺序是从右往左的,先解析css-loader 后解析style-loader将css插入dom中。           // 'style-loader',          MiniCssExtractPlugin.loader, // MiniCssExtractPlugin是将css代码提取出来,这两个loader不能同时使用。          'css-loader'        ]      },      {        test: /\.less$/,        use: [          // 'style-loader',          MiniCssExtractPlugin.loader, // MiniCssExtractPlugin是将css代码提取出来,这两个loader不能同时使用。          'css-loader',          'less-loader'    // 用于解析less         ]      },      {        test: /\.(png|jpg|gif|svg|jpeg)$/,        use: [          {            loader: 'file-loader',  // file-loader 和url-loader都行            options: {              name: '[name]_[hash:8][ext]'            }          }        ]      },      {        test: /\.(woff|woff2|eot|ttf|otf)$/,        use: [          {            loader: 'file-loader',  // file-loader 和url-loader都行            options: {              name: '[name]_[hash:8][ext]'            }          }        ]      }    ]  },复制代码

webpack 的代码的压缩

js文件的压缩

webpack 内置了,uglifyjs-webpack-plugin在打包代码的时候,会自动压缩js代码。

css 文件的压缩

使用optimize-css-assets-webpack-plugin,同时使用需要依赖 cssnano预处理器

安装 npm i optimize-css-assets-webpack-plugin cssnano -D

webpack.prod.js中配置plugins:

const OptimizeCssAssetsWebpackPlugin = requir('optimize-css-assets-webpack-plugin')plugins: [	new OptimizeCssAssetsWebpackPlugin({		assetNameRegExp:/.css$/g,		cssProcessor: require('cssnano')	})],复制代码

执行 npm run build 查看压缩效果

html文件的压缩

首先安装插件: npm i html-webpack-plugin -D

webpack.prod.js配置文件中配置:

const HtmlWebpackPlugin = require('html-webpack-plugin')plugins: [    new MiniCssExtractPlugin({      filename: `[name]_[contenthash:8].css`    }),    new OptimizeCssAssetsWebpackPlugin({      assetNameRegExp: /.css$/g,      cssProcessor: require('cssnano')    }),    new HtmlWebpackPlugin({  // 通常一个html页面用一个HtmlWebpackPlugin,如果有两那就写两个      template: path.join(__dirname, 'src/index.html'),  //html模板所在的位置      filename: 'index.html',// 指定打包出来的html文件名称      chunks: ['index'],// chunk名称 指定生成的html要使用哪些chunk      inject: true,// 是否将打包出来的js或者css将自动注入到index.html中      minify: {        html5: true,        collapseWhitespace: true,        preserveLineBreaks: false,        minifyCSS: true,        minifyJS: true,        removeComments: false      }    }),    new HtmlWebpackPlugin({  // 通常一个html页面用一个HtmlWebpackPlugin,如果有两那就写两个      template: path.join(__dirname, 'src/search.html'),  //html模板所在的位置      filename: 'search.html',// 指定打包出来的html文件名称      chunks: ['search'],// chunk名称 指定生成的html要使用哪些chunk      inject: true,// 是否将打包出来的js或者css将自动注入到search.html中      minify: {        html5: true,        collapseWhitespace: true,        preserveLineBreaks: false,        minifyCSS: true,        minifyJS: true,        removeComments: false      }    }),  ],复制代码

执行 npm run build 查看压缩效果

转载于:https://juejin.im/post/5d32c8b75188253c4b01cbff

你可能感兴趣的文章
C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰(转)
查看>>
A Simple Tree Problem
查看>>
Modular Inverse [ZOJ 3609]
查看>>
MySQL性能测试工具之mysqlslap使用详解
查看>>
深入理解jsonp跨域请求原理
查看>>
regsvr32注册COM组件失败
查看>>
jmeter,CSV数据加载、数据库连接、正则
查看>>
(独孤九剑)--正则表达式
查看>>
MySQL学习点滴 --分区表
查看>>
4.6.1 测试基础
查看>>
洛谷 P2486 [SDOI2011]染色
查看>>
oo第三单元总结
查看>>
leetcode : Count and Say [基本功]
查看>>
洛谷 P2485 [SDOI2011]计算器 解题报告
查看>>
c#访问存储过程
查看>>
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>
Node教程
查看>>
java将字段映射成另一个字段,关于 接口传参 字段不对应转换
查看>>
Redis
查看>>
字段和属性的区别
查看>>