• webpack04----详细配置:entry、output、module、resolve、dev server、optimization


    entry:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      // entry: './src/index.js', // string类型   单入口,打包形成一个chunk,输出一个bundle文件,此时chunk的名称默认是main
      // entry: ['./src/index.js', './src/add.js'], // array类型   多入口,所有入口文件最终只会形成一个chunk(即使没有使用add.js,也会一起打包到index.js中),输出出去只有一个bundle文件。作用:只有在HMR功能中让html热更新生效,这种方式针对于使用HMR功能才会使用
      entry: {
        // object类型   多入口,有几个入口文件就形成几个chunk,输出几个bundle文件,此时chunk的名称是key值
        index: ['./src/index.js', './src/count.js'], // 所有入口文件最终只会形成一个chunk,输出出去只有一个bundle文件,这种写法不管count.js有没有使用都会把count.js打包到index.js中    场景:dll对第三方库进行单独打包,将多个库打包到成一个chunk     例如 react:['react', 'react-dom', 'react-router-dom'] 将和react有关的库都打包到 'react' 这个chunk下
        add: './src/add.js' // 形成一个chunk,输出一个bundle文件
      },
      output: {
        filename: '[name].js', // [name].js   默认生成文件名:main.js
        path: resolve(__dirname, 'build')
      },
      plugins: [new HtmlWebpackPlugin()],
      mode: 'development'
    }

    output:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/index.js',
      output: {
        filename: 'js/[name].js', // 文件名称(指定目录+指定名称)
        path: resolve(__dirname, 'build'), // 输出文件目录(将来所有资源输出的公共目录)
        // publicPath:'/', // 用于生产环境,所有资源引入公共路径前缀   'images/a.jpg' --> '/images/a.jpg'
        chunkFilename:'js/[name]_chunk.js', // 非入口chunk的名称----0_chunk.js  利用import动态导入语法可以将某个文件单独打包----import('./add').then(({ default: add }) => {console.log(add(1, 2))})
        // library:'[name]', // 整个库向外暴露的变量名  var main = ...  场景:使用dll单独打包时使用
        // libraryTarget: 'window', // 作用于browser端,变量名添加到window平台上----window["main"] = ...
        // libraryTarget: 'global', // 作用于browser端,变量名添加到node平台上----window["main"] = ...
        // libraryTarget: 'commonjs', // exports["main"] = ...
        // libraryTarget: 'amd' // define("main", [], function() {})
      },
      plugins: [new HtmlWebpackPlugin()],
      mode: 'development'
    }

    module:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/index.js',
      output: {
        filename: 'js/[name].js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: ['style-loader', 'css-loader'] // 多个loader用use数组
          },
          {
            test: /.js$/,
            exclude: /node_modules/, // 排除node_modules下的js文件
            include: resolve(__dirname, 'src'), // 只检查 src 下的js文件
            enforce: 'pre', // 优先执行    场景:当一种文件被多个loader处理时需要指定loader的执行顺序,一般eslint-loader在babel-loader前执行
            // enforce:'post', // 延后执行
            loader: 'eslint-loader', // 单个loader用loader属性
            options: {} // 其他配置选项
          },
          {
            oneOf: [] // 以下配置只会生效一个
          }
        ]
      },
      plugins: [new HtmlWebpackPlugin()],
      mode: 'development'
    }

    resolve:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/[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') // 配置解析模块路径别名,优点:简写路径----import '$css/index.css',缺点:路径没有提示
        },
        extensions: ['.js', '.json', '.jsx', '.css'], // 配置省略文件路径的后缀名默认js文件和json文件可以不写后缀名,这里最好不要加上css,css文件还是写上后缀名不容易出错,----import '$css/index.css' 可以写成 import '$css/index'
        modules: [resolve(__dirname, '../../node_modules', 'node_modules')] // 告诉webpack解析模块时去找哪个目录,精确到最外层的node_modules目录,解析速度提高
      }
    }

    dev server:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/[name].js',
        path: resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /.css$/,
            use: ['style-loader', 'css-loader']
          }
        ]
      },
      plugins: [new HtmlWebpackPlugin()],
      mode: 'development',
      devServer: {
        contentBase: resolve(__dirname, 'build'), // 运行代码的目录
        watchContentBase: true, // 监视 contentBase 目录下的所有文件,一旦文件发生变化就会 reload
        watchOptions: { ignored: /node_modules/ }, // 忽略文件
        compress: true, // 启动gzip压缩
        port: 5001, // 端口号
        host: 'localhost', // 域名
        open: true, // 自动打开浏览器
        hot: true, // 开启HMR功能
        clientLogLevel: 'none', // 不显示启动服务器日志信息
        quiet: true, // 除了一些基本启动信息外,其他内容都不要显示
        overlay: false, // 如果出错了不要全屏显示
        proxy: {
          // 服务器代理,解决开发环境跨域问题
          '/api': {
            target: 'http://localhost:3000', // 一旦devServer(5001)服务器接收到 /api/xxx 的请求,就会把请求转发到另外一个服务器(3000)
            pathRewrite: { '^/api': '' } // 发送请求时,请求路径重写:将 /api/xxx --> /xxx (去掉/api)
          }
        }
      }
    }

    optimization:

      1、安装插件:npm i terser-webpack-plugin -D

      2、webpack.config.js:

    const { resolve } = require('path')
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const TerserWebpackPlugin = require('terser-webpack-plugin')
    
    module.exports = {
      entry: './src/js/index.js',
      output: {
        filename: 'js/[name].[contenthash:10].js',
        path: resolve(__dirname, 'build'),
        chunkFilename: 'js/[name].[contenthash:10]_chunk.js'
      },
      plugins: [new HtmlWebpackPlugin()],
      mode: 'production',
      optimization: {
        splitChunks: {
          chunks: 'all' // 对于单入口文件可以对node_modules提取公共代码单独打成一个包,mode必须为production
          // 以下都是默认值,一般不写
          // minSize: 30 * 1024, // 大于30kb的chunk才会去分割
          // maxSize: 0, // 最大没有限制
          // minChunks: 1, // 要提取的chunk最少被引用1次  例如:import $ from 'jquery'
          // maxAsyncRequests: 5, // 按需加载时并行加载的文件的最大数量
          // maxInitialRequests: 3, // 入口js文件最大并行请求数量
          // automaticNameDelimiter: '~', // 名称连接符
          // name: true, // 可以使用命名规则
          // cacheGroups: {
          //   // 分割chunk的组    满足上面的公共规则,如:大小超过30kb,至少被引用一次
          //   vendors: {
          //     test: /[\/]node_modules[\/]/, // node_modules文件会被打包到 vendors 组的chunks中 --> vendors~xxx.js
          //     priority: -10 // 优先级
          //   },
          //   default: {
          //     minChunks: 2, // 要提取的chunk最少被引用2次
          //     priority: -20, // 优先级
          //     reuseExistingChunk: true // 如果当前要打包的模块和之前已经被提取的模块是同一个,就会复用,而不是重新打包模块
          //   }
          // }
        },
        /*  
          问题:index.js中引入了add.js,index.js打包后的文件中记录着add.js文件的hash值,此时如果改动add.js文件但index.js文件未改动再进行打包,两个文件都进行打包了,此时性能降低了。一个js文件的修改导致了另一个js文件的缓存失效
          解决:将index.js中记录的hash值单独打包,多了一个 runtime-xxx.js文件,打包后的index.js文件中不再记录hash值,体积减小很多。此时修改add.js但index.js文件不修改再进行打包,只会打包add.js和runtime-xxx.js,index.js不会重新打包
         */
        runtimeChunk: {
          name: (entrypoint) => `runtime-${entrypoint.name}`
        },
        minimizer: [
          // 配置生产环境的压缩方案:js和css    webpack4.26版本以上使用terser-webpack-plugin压缩js代码
          new TerserWebpackPlugin({
            cache: true, // 开启缓存
            parallel: true, // 开启多进程打包
            sourceMap: true // 启动source-map
          })
        ]
      }
    }

    x

  • 相关阅读:
    《AngularJS》5个实例详解Directive(指令)机制
    angularjs入门学习【指令篇】
    --@angularJS--综合小实例1
    --@angularJS--angular与BootStrap3的应用
    --@angularJS--ng-show应用
    --@angularJS--浅谈class与Ng-Class的应用
    --@angularJS--路由插件UI-Router
    --@angularJS--路由、模块、依赖注入
    Bootstrap兼容IE8
    ANGULAR JS PROMISE使用
  • 原文地址:https://www.cnblogs.com/wuqilang/p/13962192.html
Copyright © 2020-2023  润新知