一:热更新HMR:

概念:Webpack 热更新的机制存在,则是修改了代码,不会导致刷新,而是保留现有的数据状态,只将模块进行更新替换。也就是说,既保留了现有的数据状态,又能看到代码修改后的变化。
比如:路由的更新;页面切换,不会造成原始变量的丢失

  1. const webpack = require('webpack');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin');
  3. const CleanWebpackPlugn = require('clean-webpack-plugin')
  4. module.exports = {
  5. mode: '',
  6. entry: {},
  7. output: {},
  8. rules: [{
  9. }],
  10. plugins: [
  11. new HtmlWebpackPlugin({
  12. template: './src/index.html'
  13. }) ,
  14. new CleanWabpackPlugin(),
  15. new webpack.HotModuleReplacementPlugin(); // 配置热更新插件
  16. ],
  17. devServer: {
  18. contentBase: './dist',
  19. open: true,
  20. hot: true, // 热跟新开启
  21. proxy: {
  22. '/api': {
  23. target: '',
  24. changeOrigin: true,
  25. pathRewrite: {}
  26. }
  27. }
  28. }
  29. }

image.png
image.png

二:js里的热跟新:

  1. // 在index.js 模块中判断引入模块代码的变化 只有引入的模块发生变化才能实现热跟新
  2. // 在其他的地方都将刷新页面
  3. import number from './js/number.js'
  4. number();
  5. // console.log(test) 刷新页面
  6. // 判断是否是热更新
  7. if(module.hot) {
  8. module.hot.accept('./number', () => {
  9. // 监听如果’./nuumber‘ 文件发生变化则调用回调
  10. const oldDiv = documnet.getElementById('number');
  11. document.body.remove(oldDiv) // 删除原先旧的div
  12. number() // 执行函数在新添加一个节点
  13. })
  14. }
  1. function number () {
  2. const oDiv = document.createElement('div');
  3. oDiv.id = 'number';
  4. oDiv.innerText = 88;
  5. document.body.appendChild(oDiv);
  6. }
  7. export default number;

image.png

三:babel:打包ES6代码;

1、import ‘@bael/polyfill’; 解决map,promise的新特性等的函数的处理
在当前 的业务代码中处理es6新特性函数
image.png
image.png
加入useBuiltIns: ‘usage’: 按需处理es6新特性函数;
image.png
2、配置处理es6代码:

  1. module.exports = {
  2. mode: 'development',
  3. entry: {},
  4. output: {},
  5. module: {
  6. rules: [ // 配置规则
  7. {
  8. test: /\.js$/,
  9. loader: 'babel-loader',
  10. options: {
  11. presets: ['@babel/preset-env']
  12. },
  13. exclude: /node_modules/,
  14. }
  15. ],
  16. },
  17. devServer: {}
  18. }

image.png
3、、如果想开发一个第三方的类库需配置一个插件:
image.png

4、在文件根目录下创建一个.babelrc 文件, 防止都在webpack里配置,显得乱
在webpcak中的babel-loader, 不需要配置options了, 在babelrc文件中配置;
image.png

  1. module.exports = {
  2. mode: 'development',
  3. entry: {
  4. main: './index.js' // 打包入口文件
  5. },
  6. output: {
  7. filename: 'boudle.js', // 打包后的js文件名、
  8. path: path.resolve(__dirname, 'dist'), // 打包后js放入的文件夹
  9. publicPath: 'http:// csdn.com.cn', // 在引入的src前面加上src: 'http://csdn.com'
  10. },
  11. module: {
  12. rules: [
  13. {
  14. test: /\.js$/,
  15. loader: 'babel-loader',
  16. exclude: /node_modules/, // 去除node_modules里面js文件的打包
  17. // options: [] 在.babelrc 文件中进行配置;
  18. }
  19. ]
  20. },
  21. devServer: {
  22. open: true,
  23. contentBase: '/dist',
  24. proxy: {}
  25. }
  26. }

.babelrc

A:处理基本的react代码:

1、presets: [[‘@babel/preset-env’] ]// @babel/preset-env: 将es6代码转换为es5代码

  1. // 用"" 这个格式;类似JOSN格式;如下图:

image.png
@bebel/preset-react; : 处理react代码变为es6代码;在交由@babel/preset-env:将es6代码转换为es5代码;
image.png

B:处理基本的Vue代码:

1、配置vue-loader
2、配置VueLoaderPlugin();
3、处理css, 配置: vue-style-loader

  1. module.exports = {
  2. mode: 'development',
  3. module: {
  4. rules: [
  5. {
  6. test: /.vue$/,
  7. loader: 'vue-loader',
  8. },
  9. {
  10. test: /.css$/,
  11. use: ['vue-loader', 'css-loader', 'postcss-loader'], // 处理vue中style代码块
  12. }
  13. ]
  14. },
  15. plugins: [
  16. new HtmlWebpackPlugin({
  17. template: './index.html',
  18. }),
  19. new CleanWebpackPlugin(),
  20. new VueLoaderPlugin(),
  21. ]
  22. }

image.png
image.png
image.png
image.png

四:打包react和vue文件的配置: