webpack手摸手学习系列之配置详解的 entry、output、module、resolve、devServer 和 optimization

一、webpack 配置详解之 entry
  1. 创建空文件夹,通过 npm init 命令初始化 package.json 文件,通过 npm install webpack webpack-cli -g 命令全局下载 webpackwebpack-cli,通过 npm i html-webpack-plugin -D 命令下载 html-webpack-plugin
  2. 创建 src 文件夹,在里面创建 add.jscount.jsindex.js 文件,代码如下所示:
  • add.js
    function add(x, y) {
      return x + y;
    }
    
    export default add;
    
    
  • count.js
    function count(x, y) {
      return x - y;
    }
    
    export default count;
    
    
  • index.js
     import add from './add';
     import count from './count';
    
    console.log('index.js文件加载了~');
    
     console.log(add(1, 2));
     console.log(count(3, 2));
    
    
  1. 创建 webpack.config.js 文件,通过 require 引入 pathhtml-webpack-pluginentry 是入口文件,output 是出口文件,filename 是打包输出后的文件名,path 是输出路径。plugins 里面是一些插件配置,通过 new HtmlWebpackPlugin(),复制里面的文件,并自动引入打包输出的所有资源(JS/CSS),设置 mode 模式为 development 开发模式,代码如下所示:

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

module.exports = {
    entry: {
        index: './src/index.js',
        add: './src/add.js'
    },
    output: {
        filename: '[name].js',
        path: resolve(__dirname, 'build')
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development'
}
  1. entry 是入口起点,分为三种类型,分别是 stringarrayobject ,如下所示:
类型类型描述类型写法
string单入口,打包形成一个chunk,输出一个bundle文件,此时chunk的名称默认是 main'./src/index.js'
array多入口,所有入口文件最终只会形成一个chunk,输出出去只有一个bundle文件,只有在HMR功能中让html热更新生效['./src/index.js', './src/add.js']
object多入口,有几个入口文件就形成几个chunk,输出几个bundle文件,此时chunk的名称是 key{index:'./src/index.js', add: './src/add.js'}
  1. 在命令行输入 webpack 命令,资源就会进行打包,同时在 bundle 文件夹中多出打包后的 index.jsadd.jsindex.html 文件。
二、webpack 配置详解之 output
  1. 在上面的 entry 项目中,进行修改,修改 index.js,代码如下所示:
import count from './count';

console.log('index.js文件加载了~');

import('./add').then(({ default: add }) => {
  console.log(add(1, 2));
});

console.log(count(3, 2));

  1. 修改 webpack.config.js 文件,在 output 中,filename 是文件名称(指定名称+目录),path 是输出文件目录,将来所有资源输出的公共目录, publicPath 是所有资源引入公共路径前缀,chunkFilename 是非入口 chunk 的名称,library 是整个库向外暴露的变量名, 与 dll 结合某个库单独打包,代码如下所示:

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



module.exports = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: resolve(__dirname, 'build'),
        publicPath: '/',
        chunkFilename: '[name]_chunk.js',
        library: '[name]'
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development'
}
  1. 对于 output 中的 library,类型如下所示:
类型类型描述
slibrary: '[name]'整个库向外暴露的变量名, 与 dll 结合某个库单独打包
libraryTarget: 'window'变量名添加到哪个上 browser
libraryTarget: 'global'变量名添加到哪个上 node
libraryTarget: 'commonjs'整体以 commonjs 的形式进行暴露
  1. 在命令行输入 webpack 命令,资源就会进行打包。
三、webpack 配置详解之 module
  1. 在上面的 output 项目中,进行修改,修改 webpack.config.js 文件。moduleloader 的配置,rules 是详细的 loader 配置。第一个规则是匹配以 .css 结尾的文件,test 是匹配,use 是使用 loader,使用 style-loadercss-loader。第二个规则是匹配以 .js 结尾的文件,test 是匹配,exclude 是排除 node_modules下的 js 文件,include 是只检查 src 下的 js 文件,enforcepre 是优先执行,enforcepost 是延后执行,loader 是使用 eslint-loader,单个 loaderloader。第三个规则是使用 oneOf,里面是数组,使用的 loader 及规则,并且里面的配置只会生效一个,代码如下所示:

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



module.exports = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.js$/,
                exclude: /node_modules/,
                include: resolve(__dirname, 'src'),
                enforce: 'pre',
                loader: 'eslint-loader'
            },
            {
                oneOf: []
            }
        ]
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development'
}
  1. 在命令行输入 webpack 命令,资源就会进行打包。
四、webpack 配置详解之 resolve
  1. 在上面的 output 项目中,进行修改。修改 index.js,同时新建 css 文件目录,里面创建 index.css,代码如下所示:
  • index.css
    html, body {
      height: 100%;
      background-color: pink;
    }
    
  • index.js
    import '$css/index';
    
  1. 修改 webpack.config.js 文件,resolve 是解析模块的规则,alias 是配置解析模块路径别名,优点是简写路径,缺点是路径没有提示。extensions 是配置省略文件路径的后缀名,modules 是告诉 webpack 解析模块是去找哪个目录,代码如下所示:

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



module.exports = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development',
    resolve: {
        alias: {
            $css: resolve(__dirname, 'src/css/')
        },
        extensions: ['.js', '.json', '.jsx', '.css'],
        modules: [resolve(__dirname, './node_modules'), 'node_modules']
    }
}
  1. 在命令行输入 webpack 命令,资源就会进行打包。
五、webpack 配置详解之 devServer
  1. 在上面的 resolve 项目中,进行修改,修改 webpack.config.js 文件。添加 devServercontentBase 是运行代码的目录,watchContentBase 是监视 contentBase 目录下的所有文件,一旦文件变化就会 reloadwatchOptions 中设置 ignored 是忽略监视的文件,compress 是启动 gzip 压缩,port 是端口号,host 是域名,open 是自动打开浏览器,hot 是开启 HMR 功能,clientLogLevel 是不要显示启动服务器日志信息,quiet 是除了一些基本启动信息以外,其他内容都不要显示, overlay 是如果出错了,不要全屏提示,proxy 是服务器代理去解决开发环境跨域问题,target 是目标路径,pathRewrite 是路径重写,代码如下所示:

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


module.exports = {
    entry: './src/index.js',
    output: {
        filename: '[name].js',
        path: resolve(__dirname, 'build')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development',
    resolve: {
        alias: {
            $css: resolve(__dirname, 'src/css/')
        },
        extensions: ['.js', '.json', '.jsx', '.css'],
        modules: [resolve(__dirname, './node_modules'), 'node_modules']
    },
    devServer: {
        contentBase: resolve(__dirname, 'build'),
        watchContentBase: true,
        watchOptions: {
            ignored: /node_modules/
        },
        compress: true,
        port: 5000,
        host: 'localhost',
        open: true,
        hot: true,
        clientLogLevel: 'none',
        quiet: true,
        overlay: false,
        proxy: {
            '/api': {
                target: 'http://localhost:3000',
                pathRewrite: {
                    '^/api': ''
                }
            }
        }
    }
}
  1. 在命令行输入 npx webpack-dev-server 命令,资源就会进行打包。
六、webpack 配置详解之 optimization
  1. 在上面的 devServer 项目中,进行修改,修改 js 文件夹。在里面新增 a.js,同时修改 index.js,代码如下所示:
  • a.js
    export function add(x, y) {
      return x + y;
    }
    
  • index.js
    import(/* webpackChunkName: 'a' */'./a.js').then(({ add }) => {
      console.log(add(1, 2));
    });
    
    
  1. 修改 webpack.config.js 文件,通过 npm i terser-webpack-plugin -D 命令下载 terser-webpack-plugin。添加 optimization 去优化提取代码,webpack4 中出现的,替代 webpack3commonchunk 插件。添加 splitChunks,设置 splitChunksall,说明是默认值,可以不写,如果想要修改,会在下面将详细的配置。runtimeChunk 是将当前模块的记录其他模块的 hash 单独打包为一个文件 runtime,解决的是 修改 a文件导致 b文件的 contenthash 变化。在 minimizer 中,通过 TerserWebpackPlugin 配置生产环境的压缩方案 jscsscache 是开启缓存,parallel 是开启多进程打包,sourceMap 是启动 source-map ,代码如下所示:

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

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'js/[name].[contenthash:10].js',
        path: resolve(__dirname, 'build'),
        chunkFilename: 'js/[name].[contenthash:10]_chunk.js'
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
    plugins: [ 
        new HtmlWebpackPlugin()
    ],
    mode: 'development',
    resolve: {
        alias: {
            $css: resolve(__dirname, 'src/css/')
        },
        extensions: ['.js', '.json', '.jsx', '.css'],
        modules: [resolve(__dirname, './node_modules'), 'node_modules']
    },
    devServer: {
        contentBase: resolve(__dirname, 'build'),
        watchContentBase: true,
        watchOptions: {
            ignored: /node_modules/
        },
        compress: true,
        port: 5000,
        host: 'localhost',
        open: true,
        hot: true,
        clientLogLevel: 'none',
        quiet: true,
        overlay: false,
        proxy: {
            '/api': {
                target: 'http://localhost:3000',
                pathRewrite: {
                    '^/api': ''
                }
            }
        }
    },
    optimization: {
        splitChunks: {
            chunks: 'all'
        },
        runtimeChunk: {
            name: entrypoint => `runtime-${entrypoint.name}`
        },
        minimizer: [
            new TerserWebpackPlugin({
            cache: true,
            parallel: true,
            sourceMap: true
            })
        ]
    }
}
  1. splitChunks 中的配置,如下所示:
配置类型类型描述
minSize分割的chunk最小为
maxSize分割的chunk最大为
分割的chunk最小为要提取的chunk最少被引用的次数
maxAsyncRequests按需加载时并行加载的文件的最大数量
maxInitialRequests入口js文件最大并行请求数量
automaticNameDelimiter名称连接符
name可以使用命名规则
cacheGroups分割chunk的组
  1. 在命令行输入 npx webpack-dev-server 命令,资源就会进行打包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值