zoukankan      html  css  js  c++  java
  • webpack4.x打包 配置

    webpack4.x打包 配置

    webpack简介

      webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

    webpack的GitHub地址:https://github.com/webpack/webpack

    webpack4.x文档地址:https://webpack.js.org/concepts/

    中文文档地址:https://www.webpackjs.com/guides/getting-started/

    webpack的优势

    1. 代码拆分
    Webpack 有两种组织模块依赖的方式,同步(默认)和异步(高级)。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。
    2. Loader
    Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。
    3. 智能解析
    (webpack 是以 commonJS 的形式来书写的脚本)Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。
    4. 插件系统
    Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。
    5. 快速运行
    Webpack 使用异步 I/O (NodeJs)和多级“缓存”提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译(可以通过配置打包成多个文件,有效的利用浏览器的缓存功能提升性能)。
    

    webpack使用前的准备工作

      因为webpack是一个基于node的项目,所有我们需要本地环境支持 node.js (一直点击下一步即可)。

    安装完成后通过命令来检查node和npm的版本,但npm的国内镜像比较慢,因此可以安装淘宝的镜像,使用cnpm命令。

    node -v   //检查nodejs的版本
    
    npm -v  //检查npm的版本
    
    cnpm -v    //检查cnpm的版本
    

      安装成功后输入上方命令出现下图所示表示安装成功,准备工作完毕。

    webpack的安装

    //全局安装
    npm install -g webpack
    //本地安装(-D或者--save-dev)
    npm install -D webpack
    //可以安装最新版本,也可以通过在webpack后面加一个@然后在填入你要安装的版本号
    //例如 npm install webpack@4 -D
    //通过webpack -v来查看安装的webpack的版本
    

    创建项目

    1. 创建一个目录(文件夹)
    2. 通过vscode打开(也可以在cmd窗口执行命令)
    3. 通过执行  npm init  命令来创建package.json文件
    4. 本地安装webpack(可以安装最新版本或者指定版本)(如果全局安装过,此处如果想重新安装,建议和全局安装的版本一致,不然很容易出错)
    5. 建议在src目录下创建存放js、html、css的目录
    6. 在对应的目录下创建index.js  index.css index.html三个文件
    7. 创建dist目录用于存放打包后的文件
    8. 在项目的根目录下创建webpack.config.js文件用于配置webpack
    

    创建项目后此时的目录如下:

    其中,webpack.config.js为webpack的配置文件,index.html为打包的HTML的模板文件,index.js为打包的入口文件,dist为打包的输出文件目录,index.css中为css代码,用于下方打包css文件。

    webpack打包样式资源(css、less、scss)

    //本地安装安装css-loader、style-loader、less-loader、less、sass-loader 、node-sass
    npm i -D css-loader style-loader less-loader less sass-loader node-sass
    

    webpack.config.js文件配置如下:

     /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
    
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
          {
            // 匹配哪些文件
            test: /.css$/,
            // 使用哪些loader进行处理
            use: [
              // use数组中loader执行顺序:从右到左,从下到上 依次执行
              // 创建style标签,将js中的样式资源插入进行,添加到head中生效
              'style-loader',
              // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
              'css-loader'
            ]
          },
          {
            test: /.less$/,
            use: [
              'style-loader',
              'css-loader',
              // 将less文件编译成css文件
              // 需要下载 less-loader和less
              'less-loader'
            ]
          },
          {
              test: /.scss$/, 
              use: [
              'style-loader',
              'css-loader',
              'sass-loader'
              ]
          },
        ]
      },
      // plugins的配置
      plugins: [
        // 详细plugins的配置
      ],
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 webpack 命令来打包,也可以在package.json的scripts中配置如下命令,然后通过执行 npm run build 命令来打包

    "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack"
    },
    

    webpack打包HTML资源

    //本地安装html-webpack-plugin
    npm i -D html-webpack-plugin
    

    webpack.config.js的配置如下:

        /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
        ]
      },
      // plugins的配置
      plugins: [
        // html-webpack-plugin
        // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
        // 需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js。
          // 复制 './src/html/index.html' 模板文件,并自动引入打包输出的所有资源(JS/CSS)
          template: './src/html/index.html'
        })
      ],
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    webpack打包图片资源

    //本地安装url-loader 、 file-loader 、html-loader
    npm i -D url-loader file-loader html-loader
    

    webpack.config.js的配置如下:

        /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
          {
            // 处理图片资源
            test: /.(jpg|png|gif)$/,
             // 下载 url-loader file-loader
             //url-loader依赖于file-loader
            // 使用一个loader
            loader: 'url-loader',
            options: {
              // 图片大小小于8kb,就会被base64处理
              // 优点: 减少请求数量(减轻服务器压力)
              // 缺点:图片体积会更大(文件请求速度更慢)
              limit: 8 * 1024,
              // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
              // 解析时会出问题:[object Module]
              // 解决:关闭url-loader的es6模块化,使用commonjs解析
              esModule: false,
              // 给图片进行重命名
              // [hash:7]取图片的hash的前7位
              // [ext]取文件原来扩展名
              name: '[hash:7].[ext]'
            }
          },
          {
            test: /.html$/,
            // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
            loader: 'html-loader'
          }
          
        ]
      },
      // plugins的配置
      plugins: [
        // html-webpack-plugin
        // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
        // 需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js。
          // 复制 './src/html/index.html' 模板文件,并自动引入打包输出的所有资源(JS/CSS)
          template: './src/html/index.html'
        })
      ],
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    webpack打包其他资源

    webpack.config.js的配置如下:

        /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
          {
            // 处理图片资源
            test: /.(jpg|png|gif)$/,
             // 下载 url-loader file-loader
             //url-loader依赖于file-loader
            // 使用一个loader
            loader: 'url-loader',
            options: {
              // 图片大小小于8kb,就会被base64处理
              // 优点: 减少请求数量(减轻服务器压力)
              // 缺点:图片体积会更大(文件请求速度更慢)
              limit: 8 * 1024,
              // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
              // 解析时会出问题:[object Module]
              // 解决:关闭url-loader的es6模块化,使用commonjs解析
              esModule: false,
              // 给图片进行重命名
              // [hash:7]取图片的hash的前7位
              // [ext]取文件原来扩展名
              name: '[hash:7].[ext]'
            }
          },
          {
            test: /.html$/,
            // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
            loader: 'html-loader'
          },
           // 打包其他资源(除了html/js/css资源以外的资源)
          {
            // 排除css/js/html资源
            exclude: /.(css|js|html|less)$/,
            loader: 'file-loader',
            options: {
              name: '[hash:7].[ext]'
            }
          }
          
        ]
      },
      // plugins的配置
      plugins: [
        // html-webpack-plugin
        // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
        // 需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js。
          // 复制 './src/html/index.html' 模板文件,并自动引入打包输出的所有资源(JS/CSS)
          template: './src/html/index.html'
        })
      ],
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    devServer

    //本地安装 webpack-dev-server
    npm i -D webpack-dev-server
    

    webpack.config.js的配置如下:

        /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
          {
            // 处理图片资源
            test: /.(jpg|png|gif)$/,
             // 下载 url-loader file-loader
             //url-loader依赖于file-loader
            // 使用一个loader
            loader: 'url-loader',
            options: {
              // 图片大小小于8kb,就会被base64处理
              // 优点: 减少请求数量(减轻服务器压力)
              // 缺点:图片体积会更大(文件请求速度更慢)
              limit: 8 * 1024,
              // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
              // 解析时会出问题:[object Module]
              // 解决:关闭url-loader的es6模块化,使用commonjs解析
              esModule: false,
              // 给图片进行重命名
              // [hash:7]取图片的hash的前7位
              // [ext]取文件原来扩展名
              name: '[hash:7].[ext]'
            }
          },
          {
            test: /.html$/,
            // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
            loader: 'html-loader'
          },
           // 打包其他资源(除了html/js/css资源以外的资源)
          {
            // 排除css/js/html资源
            exclude: /.(css|js|html|less)$/,
            loader: 'file-loader',
            options: {
              name: '[hash:7].[ext]'
            }
          }
          
        ]
      },
      // plugins的配置
      plugins: [
        // html-webpack-plugin
        // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
        // 需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js。
          // 复制 './src/html/index.html' 模板文件,并自动引入打包输出的所有资源(JS/CSS)
          template: './src/html/index.html'
        })
      ],
      
      // 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新浏览器~~)
      // 特点:只会在内存中编译打包,不会有任何输出。
      // 启动devServer指令为:npx webpack-dev-server
      devServer: {
        // 项目构建后路径,本地服务器所加载的页面所在的目录
        contentBase: resolve(__dirname, 'build'),
        // 启动gzip压缩
        compress: true,
        // 端口号
        port: 8089,
        //当源文件改变时会自动刷新页面,实时刷新
        inline:true,
        //在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向打包后生成的index.html,即不跳转
        historyApiFallback:true,
        // 自动打开浏览器
        open: true
      }
      
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 npx webpack-dev-server 命令来运行,也可以在package.json的scripts中配置如下命令,然后通过执行 npm run devserver 命令运行

     "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack",
    "devserver": "npx webpack-dev-server"
    },
    

    开发环境配置

    webpack.config.js的配置如下:

     /*
      webpack.config.js  webpack的配置文件
        作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
        所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
    */
    
    // resolve用来拼接绝对路径的方法
    const { resolve } = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    
    module.exports = {
      // webpack配置
      // 入口起点
      entry: './src/js/index.js',
      // 输出
      output: {
        // 输出文件名
        filename: '[name].[hash:7].js',
        // 输出路径
        // __dirname nodejs的变量,代表当前文件的目录绝对路径
        path: resolve(__dirname, 'dist')
      },
      // loader的配置
      module: {
        rules: [
          // 详细loader配置
          // 不同文件必须配置不同loader处理
            {
            // 匹配哪些文件
            test: /.css$/,
            // 使用哪些loader进行处理
            use: [
              // use数组中loader执行顺序:从右到左,从下到上 依次执行
              // 创建style标签,将js中的样式资源插入进行,添加到head中生效
              'style-loader',
              // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
              'css-loader'
            ]
          },
          {
            test: /.less$/,
            use: [
              'style-loader',
              'css-loader',
              // 将less文件编译成css文件
              // 需要下载 less-loader和less
              'less-loader'
            ]
          },
          {
              test: /.scss$/, 
              use: [
              'style-loader',
              'css-loader',
              'sass-loader'
              ]
          },
          {
            // 处理图片资源
            test: /.(jpg|png|gif)$/,
             // 下载 url-loader file-loader
             //url-loader依赖于file-loader
            // 使用一个loader
            loader: 'url-loader',
            options: {
              // 图片大小小于8kb,就会被base64处理
              // 优点: 减少请求数量(减轻服务器压力)
              // 缺点:图片体积会更大(文件请求速度更慢)
              limit: 8 * 1024,
              // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
              // 解析时会出问题:[object Module]
              // 解决:关闭url-loader的es6模块化,使用commonjs解析
              esModule: false,
              // 给图片进行重命名
              // [hash:7]取图片的hash的前7位
              // [ext]取文件原来扩展名
              name: '[hash:7].[ext]'
            }
          },
          {
            test: /.html$/,
            // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
            loader: 'html-loader'
          },
           // 打包其他资源(除了html/js/css资源以外的资源)
          {
            // 排除css/js/html资源
            exclude: /.(css|js|html|less)$/,
            loader: 'file-loader',
            options: {
              name: '[hash:7].[ext]'
            }
          }
          
        ]
      },
      // plugins的配置
      plugins: [
        // html-webpack-plugin
        // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
        // 需求:需要有结构的HTML文件
        new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js。
          // 复制 './src/html/index.html' 模板文件,并自动引入打包输出的所有资源(JS/CSS)
          template: './src/html/index.html'
        })
      ],
      
      // 开发服务器 devServer:用来自动化(自动编译,自动打开浏览器,自动刷新浏览器~~)
      // 特点:只会在内存中编译打包,不会有任何输出。
      // 启动devServer指令为:npx webpack-dev-server
      devServer: {
        // 项目构建后路径,本地服务器所加载的页面所在的目录
        contentBase: resolve(__dirname, 'build'),
        // 启动gzip压缩
        compress: true,
        // 端口号
        port: 8089,
        //当源文件改变时会自动刷新页面,实时刷新
        inline:true,
        //在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向打包后生成的index.html,即不跳转
        historyApiFallback:true,
        // 自动打开浏览器
        open: true
      }
      
      // 模式
      mode: 'development',    // 开发环境
      // mode: 'production'   //生产环境
    }
    

    通过在vscode 的terminal窗口执行 npx webpack-dev-server 命令来运行,也可以执行 npm run devserver 命令运行

    提取css成单独文件

    //本地安装安装mini-css-extract-plugin
    npm i -D mini-css-extract-plugin
    

    webpack.config.js 配置如下:

       /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
        */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        
        module.exports = {
          // webpack配置
          // 入口起点
          entry: './src/js/index.js',
          // 输出
          output: {
            // 输出文件名
            filename: '[name].[hash:7].js',
            // 输出路径
            // __dirname nodejs的变量,代表当前文件的目录绝对路径
            path: resolve(__dirname, 'dist')
          },
          // loader的配置
          module: {
            rules: [
              // 详细loader配置
              // 不同文件必须配置不同loader处理
              {
                // 匹配哪些文件
                test: /.css$/,
                // 使用哪些loader进行处理
                use: [
                  // use数组中loader执行顺序:从右到左,从下到上 依次执行
                  // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                  // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                  'css-loader'
                ]
              },
              {
                test: /.less$/,
                use: [
                   // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  'css-loader',
                  // 将less文件编译成css文件
                  // 需要下载 less-loader和less
                  'less-loader'
                ]
              },
              {
                  test: /.scss$/, 
                  use: [
                   //'style-loader',
                   MiniCssExtractPlugin.loader,
                  'css-loader',
                  'sass-loader'
                  ]
              },
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          }),
          ],
          // 模式
          mode: 'development',    // 开发环境
          // mode: 'production'   //生产环境
        }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    css兼容性处理

    //本地安装安装postcss-loader postcss-preset-env
    npm i -D postcss-loader postcss-preset-env
    

    webpack.config.js 配置如下:

       /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
        */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        
        // 设置nodejs环境变量
       // process.env.NODE_ENV = 'development';
        
        module.exports = {
          // webpack配置
          // 入口起点
          entry: './src/js/index.js',
          // 输出
          output: {
            // 输出文件名
            filename: '[name].[hash:7].js',
            // 输出路径
            // __dirname nodejs的变量,代表当前文件的目录绝对路径
            path: resolve(__dirname, 'dist')
          },
          // loader的配置
          module: {
            rules: [
              // 详细loader配置
              // 不同文件必须配置不同loader处理
              {
                // 匹配哪些文件
                test: /.css$/,
                // 使用哪些loader进行处理
                use: [
                  // use数组中loader执行顺序:从右到左,从下到上 依次执行
                  // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                  // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                  'css-loader',
                /*
                css兼容性处理:postcss --> postcss-loader postcss-preset-env
                
                帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
                
                  // 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
                  // 生产环境:默认是生产环境
    
              */
                {
                 loader: 'postcss-loader',
                 options: {
                  ident: 'postcss',
                  plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                  ]
                }
              }
                ]
              },
              {
                test: /.less$/,
                use: [
                   // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  'css-loader',
                  // 将less文件编译成css文件
                  // 需要下载 less-loader和less
                  'less-loader'
                ]
              },
              {
                  test: /.scss$/, 
                  use: [
                   //'style-loader',
                   MiniCssExtractPlugin.loader,
                  'css-loader',
                  'sass-loader'
                  ]
              },
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          })
          ],
          // 模式
          mode: 'development',    // 开发环境
          // mode: 'production'   //生产环境
        }
    

    package.json中配置如下:

    具体可参考browserslist官网:https://github.com/browserslist/browserslist

      "browserslist": {
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ],
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ]
      },
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    压缩css

    //本地安装安装optimize-css-assets-webpack-plugin
    npm i -D optimize-css-assets-webpack-plugin
    

    webpack.config.js 配置如下:

           /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
        */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
        
          // 设置nodejs环境变量
          // process.env.NODE_ENV = 'development';
           
           module.exports = {
             // webpack配置
             // 入口起点
             entry: './src/js/index.js',
             // 输出
             output: {
               // 输出文件名
              filename: '[name].[hash:7].js',
               // 输出路径
              // __dirname nodejs的变量,代表当前文件的目录绝对路径
               path: resolve(__dirname, 'dist')
             },
            // loader的配置
             module: {
               rules: [
                  // 详细loader配置
                 // 不同文件必须配置不同loader处理
                 {
                    // 匹配哪些文件
                   test: /.css$/,
                    // 使用哪些loader进行处理
                  use: [
                     // use数组中loader执行顺序:从右到左,从下到上 依次执行
                     // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                     // 'style-loader',
                      MiniCssExtractPlugin.loader,
                      // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                     'css-loader',
                   /*
                   css兼容性处理:postcss --> postcss-loader postcss-preset-env
                    
                   帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
                   
                      // 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
                      // 生产环境:默认是生产环境
              */
                {
                 loader: 'postcss-loader',
                 options: {
                  ident: 'postcss',
                  plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                  ]
                }
              }
                ]
              },
              {
                test: /.less$/,
                use: [
                   // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  'css-loader',
                  // 将less文件编译成css文件
                  // 需要下载 less-loader和less
                  'less-loader'
                ]
              },
              {
                  test: /.scss$/, 
                  use: [
                   //'style-loader',
                   MiniCssExtractPlugin.loader,
                  'css-loader',
                  'sass-loader'
                  ]
              },
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          }),
            // 压缩css
    new OptimizeCssAssetsWebpackPlugin()
          ],
          // 模式
          mode: 'development',    // 开发环境
          // mode: 'production'   //生产环境
        }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    js语法检查

    //本地安装安装 eslint-loader 、 eslint 、eslint-config-airbnb-base 、 eslint-plugin-import 
    npm i -D eslint-loader eslint eslint-config-airbnb-base eslint-plugin-import 
    

    webpack.config.js 配置如下:

         /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
        */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
        
          // 设置nodejs环境变量
           // process.env.NODE_ENV = 'development';
           
            module.exports = {
              // webpack配置
              // 入口起点
              entry: './src/js/index.js',
              // 输出
              output: {
                // 输出文件名
                filename: '[name].[hash:7].js',
                // 输出路径
                // __dirname nodejs的变量,代表当前文件的目录绝对路径
                path: resolve(__dirname, 'dist')
              },
              // loader的配置
              module: {
               rules: [
                // 详细loader配置
                 // 不同文件必须配置不同loader处理
                  {
                    // 匹配哪些文件
                   test: /.css$/,
                   // 使用哪些loader进行处理
                    use: [
                      // use数组中loader执行顺序:从右到左,从下到上 依次执行
                      // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                      // 'style-loader',
                   MiniCssExtractPlugin.loader,
                     // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                   'css-loader',
                   /*
                    css兼容性处理:postcss --> postcss-loader postcss-preset-env
             帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
                 // 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
                  // 生产环境:默认是生产环境
    
              */
                {
                 loader: 'postcss-loader',
                 options: {
                  ident: 'postcss',
                  plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                  ]
                }
              }
                ]
              },
              {
                test: /.less$/,
                use: [
                   // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  'css-loader',
                  // 将less文件编译成css文件
                  // 需要下载 less-loader和less
                  'less-loader'
                ]
              },
              {
                  test: /.scss$/, 
                  use: [
                   //'style-loader',
                   MiniCssExtractPlugin.loader,
                  'css-loader',
                  'sass-loader'
                  ]
              },
         /*
          语法检查: eslint-loader  eslint
          注意:只检查自己写的源代码,第三方的库是不用检查的
          设置检查规则:
            package.json中eslintConfig中设置~
        */
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'eslint-loader',
            options: {
              // 自动修复eslint的错误
              fix: true
            }
          }
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          }),
            // 压缩css
    new OptimizeCssAssetsWebpackPlugin()
          ],
          // 模式
          mode: 'development',    // 开发环境
          // mode: 'production'   //生产环境
        }
    

    package.json中eslintConfig中设置如下:

    "eslintConfig": {
    "extends": "airbnb-base",
    "env": {
      "browser": true
      }
    }
    

    通过在vscode 的terminal窗口执行 webpack 命令 或者 npm run build 命令来打包文件

    js兼容性处理eslint

    //本地安装安装 babel-loader 、 @babel/core 、 @babel/preset-env 、 @babel/polyfill 、core-js
    npm i -D babel-loader @babel/core @babel/preset-env @babel/polyfill core-js
    

    webpack.config.js 配置如下:

      /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
        */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
        
    // 设置nodejs环境变量
       // process.env.NODE_ENV = 'development';
        
        module.exports = {
          // webpack配置
          // 入口起点
          entry: './src/js/index.js',
          // 输出
          output: {
            // 输出文件名
            filename: '[name].[hash:7].js',
            // 输出路径
            // __dirname nodejs的变量,代表当前文件的目录绝对路径
            path: resolve(__dirname, 'dist')
          },
          // loader的配置
          module: {
            rules: [
              // 详细loader配置
              // 不同文件必须配置不同loader处理
              {
                // 匹配哪些文件
                test: /.css$/,
                // 使用哪些loader进行处理
                use: [
                  // use数组中loader执行顺序:从右到左,从下到上 依次执行
                  // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                  // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                  'css-loader',
                /*
                css兼容性处理:postcss --> postcss-loader postcss-preset-env
                
                帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式
                
                  // 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
                  // 生产环境:默认是生产环境
    
              */
                {
                 loader: 'postcss-loader',
                 options: {
                  ident: 'postcss',
                  plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                  ]
                }
              }
                ]
              },
        /*
        js兼容性处理:babel-loader @babel/core 
          1. 基本js兼容性处理 --> @babel/preset-env
            问题:只能转换基本语法,如promise高级语法不能转换
          2. 全部js兼容性处理 --> @babel/polyfill  
            问题:我只要解决部分兼容性问题,但是将所有兼容性代码全部引入,体积太大了~
          3. (推荐使用)需要做兼容性处理的就做:按需加载  --> core-js
        */  
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            options: {
              // 预设:指示babel做怎么样的兼容性处理
              presets: [
                [
                  '@babel/preset-env',
                  {
                    // 按需加载
                    useBuiltIns: 'usage',
                    // 指定core-js版本
                    corejs: {
                      version: 3
                    },
                    // 指定兼容性做到哪个版本浏览器
                    targets: {
                      chrome: '60',
                      firefox: '60',
                      ie: '9',
                      safari: '10',
                      edge: '17'
                    }
                  }
                ]
              ]
            }
          }
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          }),
            // 压缩css
    new OptimizeCssAssetsWebpackPlugin()
          ],
          // 模式
          mode: 'development',    // 开发环境
          // mode: 'production'   //生产环境
        }
    

    压缩HTML&js

    // 生产环境下会自动压缩js代码
    mode: 'production'
    
    // 压缩HTML代码只需要在 plugins中的new HtmlWebpackPlugin中添加如下设置即可。
     new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
    

    生产环境配置

    webpack.config.js 配置如下:

      /*
          webpack.config.js  webpack的配置文件
            作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
    
            所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
      */
    
        // resolve用来拼接绝对路径的方法
        const { resolve } = require('path');
        const HtmlWebpackPlugin = require('html-webpack-plugin');
        const MiniCssExtractPlugin = require('mini-css-extract-plugin');
        const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
        
    // 设置nodejs环境变量,决定使用browserslist的哪个环境
       // process.env.NODE_ENV = 'production';
        
        module.exports = {
          // webpack配置
          // 入口起点
          entry: './src/js/index.js',
          // 输出
          output: {
            // 输出文件名
            filename: '[name].[hash:7].js',
            // 输出路径
            // __dirname nodejs的变量,代表当前文件的目录绝对路径
            path: resolve(__dirname, 'dist')
          },
          // loader的配置
          module: {
            rules: [
              // 详细loader配置
              // 不同文件必须配置不同loader处理
              {
                // 匹配哪些文件
                test: /.css$/,
                // 使用哪些loader进行处理
                use: [
                  // use数组中loader执行顺序:从右到左,从下到上 依次执行
                  // 创建style标签,将js中的样式资源插入进行,添加到head中生效
                  // 'style-loader',
                  MiniCssExtractPlugin.loader,
                  // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
                  'css-loader',
                //css兼容性处理
                {
                 loader: 'postcss-loader',
                 options: {
                  ident: 'postcss',
                  plugins: () => [
                    // postcss的插件
                    require('postcss-preset-env')()
                  ]
                }
              }
                ]
              },
     
        //js兼容性处理,按需加载
         /*
            正常来讲,一个文件只能被一个loader处理。
            当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
              先执行eslint 在执行babel
          */
          {
            // 在package.json中eslintConfig --> airbnb
            test: /.js$/,
            exclude: /node_modules/,
            // 优先执行
            enforce: 'pre',
            loader: 'eslint-loader',
            options: {
              fix: true
            }
          },
          {
            test: /.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            options: {
              // 预设:指示babel做怎么样的兼容性处理
              presets: [
                [
                  '@babel/preset-env',
                  {
                    // 按需加载
                    useBuiltIns: 'usage',
                    // 指定core-js版本
                    corejs: {
                      version: 3
                    },
                    // 指定兼容性做到哪个版本浏览器
                    targets: {
                      chrome: '60',
                      firefox: '60',
                      ie: '9',
                      safari: '10',
                      edge: '17'
                    }
                  }
                ]
              ]
            }
          },
           {
            // 处理图片资源
            test: /.(jpg|png|gif)$/,
             // 下载 url-loader file-loader
             //url-loader依赖于file-loader
            // 使用一个loader
            loader: 'url-loader',
            options: {
              // 图片大小小于8kb,就会被base64处理
              // 优点: 减少请求数量(减轻服务器压力)
              // 缺点:图片体积会更大(文件请求速度更慢)
              limit: 8 * 1024,
              // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
              // 解析时会出问题:[object Module]
              // 解决:关闭url-loader的es6模块化,使用commonjs解析
              esModule: false,
              // 给图片进行重命名
              // [hash:7]取图片的hash的前7位
              // [ext]取文件原来扩展名
              name: '[hash:7].[ext]'
            }
          },
          {
            test: /.html$/,
            // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
            loader: 'html-loader'
          },
           // 打包其他资源(除了html/js/css资源以外的资源)
          {
            // 排除css/js/html资源
            exclude: /.(css|js|html|less)$/,
            loader: 'file-loader',
            options: {
              name: '[hash:7].[ext]'
            }
          }
            ]
          },
          // plugins的配置
          plugins: [
           new HtmlWebpackPlugin({
         // 压缩HTML代码
          minify: {
            removeAttributeQuotes: true, //去除引号
            removeComments: true, //去除注释
            collapseWhitespace: true //去除空格
          },
          hash: false, //避免缓存js
          // 打包html模版的文件名称
          template: './src/html/index.html'
        })
      ],
          // 提取css为单独文件
          new MiniCssExtractPlugin({
          // 对输出的css文件进行重命名
          filename: '[name].[hash:7].css'
          }),
            // 压缩css
        new OptimizeCssAssetsWebpackPlugin()
          ],
          // 模式
          // mode: 'development',    // 开发环境
          mode: 'production'   //生产环境
        }
    

    参考链接:

    https://segmentfault.com/a/1190000006178770

    https://www.runoob.com/w3cnote/webpack-tutorial.html

    https://www.webpackjs.com/guides/getting-started/

    https://webpack.js.org/concepts/

    https://github.com/webpack/webpack#introduction


    作  者:sweetheart1998
    出  处:https://home.cnblogs.com/u/gujun1998/
    如有问题或建议,请多多赐教!
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    如果您觉得文章对您有帮助,可以点击文章右下角推荐一下!

  • 相关阅读:
    alpha冲刺3
    alpha冲刺2
    alpha冲刺1
    软工第七次作业
    软工第八次作业
    软工第六次作业
    软工第五次作业
    软工第四次作业
    Alpha冲刺一 (2/10)
    Alpha冲刺一(1/10)
  • 原文地址:https://www.cnblogs.com/gujun1998/p/13957941.html
Copyright © 2011-2022 走看看