webpack入门4----优化环境配置(下)

本文详细介绍了webpack的配置,包括代码分割以提高运行速度,懒加载实现按需加载,PWA渐进式网络应用的设置,使用workbox插件,多线程打包通过thread-loader加速,以及externals处理CDN引入的库,避免重复打包。此外,还讲解了DLL技术,用于第三方库的单独打包,提升构建效率。
摘要由CSDN通过智能技术生成

项目内容上传到了  码云 https://gitee.com/a2547944268/webpack_test上,下面的内容对照着代码的话,可能更清晰。

6.code split 

主要是两个位置:入口拆分代码及将node_modules中代码单独打包成一个chunk输出

代码分割的目的:提高代码运行速度

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

module.exports = {
    entry: {
        index: './src/js/index.js',
        test: './src/js/test.js'
    },
    output: {
        filename: 'js/[name].[contenthash:10].js',
        path: resolve(__dirname, 'build')
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            minify: {
                collapseWhitespace: true,
                removeComments: true
            }
        })
    ],
    /*
    将代码分割成多个js文件
      1.可以将node_modules中代码单独打包成一个chunk最终输出
      2.自动分析多入口文件chunk中,有没有公共的文件,如果有会打包一个chunk
    */ 
    optimization: {
        splitChunks: {
            chunks: 'all'
        }
    },
    mode: 'production',
};

7.lazy loading

具体看gitee上拉下来的代码,因为这个没有在webpack.config.js内配置,是在代码内进行配置的,所以只写代码内配置

在触发什么条件的时候,然后再加载一些文件

document.getElementById('btn').onclick = function(){
    // 先进行了代码分割,然后进行了懒加载
    // 懒加载:文件使用时才加载
    // 预加载prefetch:会在使用前加载js文件
    // 正常加载可以认为是并行加载(同一时间加载多个文件)   
    // 预加载prefetch:等其他资源加载完毕,浏览器加载完成了,再偷偷加载资源  缺点:兼容性很差
    import(/* webpackChunkName: 'test', webpackPrefetch: true */'./test').then(({mul}) => {
        console.log(mul(4,5));
    })
}

8.pwa

PWA:渐进式网络开发应用程序(离线可访问)

    workbox --> workbox-webpack-plugin

需要先安装:

npm install --save-dev workbox-webpack-plugin

这个主要是使用插件  workbox-webpack-plugin

安装完成了,对webpack.config.js的配置如下:

/*
  PWA:渐进式网络开发应用程序(离线可访问)
    workbox --> workbox-webpack-plugin

*/

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

process.env.NODE_ENV = 'production';

module.exports = {
  entry: ['./src/js/index.js', './src/index.html'],
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build'),
  },
  module: {
    rules: [
      // loader的配置
      {
        // 处理less资源
        test: /\.less$/,
        use: ['style-loader', 'css-loader', 'less-loader'],
      },
      // css文件是放置在js文件内的,不需要单独文件夹存放
      {
        // 处理css资源
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
      {
        // 处理图片资源
        test: /\.(jpg|png|gif)$/,
        loader: 'url-loader',
        options: {
          limit: 8 * 1024,
          name: '[hash:10].[ext]',
          // 关闭es6模块化
          esModule: false,
          outputPath: 'imgs',
        },
      },
      {
        // 处理html中img资源
        test: /\.html$/,
        loader: 'html-loader',
        options: {
          esModule: true,
        },
      },
      {
        // 处理其他资源
        exclude: /\.(html|js|css|less|jpg|png|gif)/,
        loader: 'file-loader',
        options: {
          name: '[hash:10].[ext]',
          outputPath: 'media',
        },
      },
    ],
  },
  plugins: [
    // plugins的配置
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
    new WorkboxWebpackPlugin.GenerateSW({
      /*
        1.帮助serviceworker快速启动
        2.删除旧的 serviceworker

        生成一个 serviceworker 配置文件
      */
      clientsClaim: true,
      skipWaiting: true,
    }),
  ],
  mode: 'production',
  devServer: {
    contentBase: resolve(__dirname, 'build'),
    compress: true,
    port: 3000,
    open: true,
    // 开启HMR
    // 当修改了webpack配置,新配置想要生效,必须重启webpack服务
    hot: true,
  },
  devtool: 'eval-source-map',
};

9.多线程打包

安装thread-loader

npm install --saave-dev thread-loader

webpack.config.js的loader位置的代码,在打包js的时候开启多进程打包。

{
	test: /\.js$/,
	exclude: /node_modules/,
	use: [
	  /*
		  开启多进程打包
		  进程启动大概为600ms,进程通信也有开销
		  只有工作消耗时间比较长,才需要多进程打包
	  */
	  {
		loader: 'thread-loader',
		options: {
		  workers: 2, // 进程两个
		},
	  },
	  {
		loader: 'babel-loader',
		options: {
		  presets: [
			[
			  '@babel/preset-env',
			  {
				useBuiltIns: 'usage',
				corejs: { version: 3 },
				targets: {
				  chrome: '60',
				  firefox: '50',
				},
			  },
			],
		  ],
		},
	  },
	],
  },

10.externals

这个的作用主要是在html内引入了某些框架的cdn等其他文件,在打包的时候不需要打包

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

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build'),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
  ],
  mode: 'production',
  externals: {
    // 通过cdn引入速度更快
    // 格式:忽略库名 --> npm包名
    jquery: 'jQuery', // 拒绝jQuery被打包进来
  },
};

10.dll

使用dll技术对某些库(第三方库:jquery、react、vue)进行单独打包

    当运行webpack时,默认查找webpack.config.js配置文件

    需求:需要运行webpack.dll.js文件

    -->  指令(运行):webpack --config webpack.dll.js

    安装:add-asset-html-webpack-plugin

配置

webpack.config.js

const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build'),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
    // 下面的重点是优化了jquery重复打包的性能

    // 告诉webapck哪些库不参与打包,同时使用时得到名称也得变    打包时先忽略jquery
    new webpack.DllReferencePlugin({
      manifest: resolve(__dirname, 'dll/manifest.json'),
    }),
    // 将某个文件打包输出去,并在html内自动引入该资源   会将dll内产生的资源引入到打包后的build文件内   再将jquery引进来
    new AddAssetHtmlWebpackPlugin({
      filepath: resolve(__dirname, 'dll/jquery.js'),
    }),
  ],
  mode: 'production',
};

webpack.dll.js

/*
  使用dll技术对某些库(第三方库:jquery、react、vue)进行单独打包
    当运行webpack时,默认查找webpack.config.js配置文件
    需求:需要运行webpack.dll.js文件
    -->  指令(运行):webpack --config webpack.dll.js

    安装:add-asset-html-webpack-plugin
*/

const { resolve } = require('path');
const webpack = require('webpack');

module.exports = {
  entry: {
    // 最终打包生成的[name] --> jquery
    // ['jquery'] --> 要打包的库是jquery
    jquery: ['jquery'],
    // react: ['react', 'react-dom', 'react-router-dom'],
  },
  output: {
    filename: '[name].js',
    path: resolve(__dirname, 'dll'),
    library: '[name]_[hash]', // 打包的库里面向外暴露出去的内容叫什么名字
  },
  plugins: [
    // 打包生成一个manifest.json --> 提供和jquery映射
    new webpack.DllPlugin({
      name: '[name]_[hash]', // 映射库的暴露的内容名称
      path: resolve(__dirname, 'dll/manifest.json'), // 输出文件路径
    }),
  ],
  mode: 'production',
};

运行指令为:webpack

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值