vue知识点七-webpack

 网站  https://webpack.docschina.org
 文档 https://webpack.docschina.org/concepts/
  简介:本质上,webpack 是一个前端资源构建工具,用于现代 JavaScript 应用程序的静态模块打包工具。
        当webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),
        此依赖图对应映射到项目所需的每个模块,并生成一个或多个 bundle。
  全局下载包
    cnpm install -g webpack webpack-cli
    或者cnpm i -g webpack webpack-cli
  局部下载包
    初始化项目npm init -y
    下载包
      cnpm i --save-dev webpack webpack-cli
      或者cnpm i -D webpack webpack-cli
  五大模块
    入口(entry)
    输出(output)
    loader加载器 (module)
    插件(plugin)
    模式(mode)

  1.入口

    入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部 依赖图(dependency graph) 的开始。
    进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
    认值是 ./src/index.js,但你可以通过在 webpack configuration 中配置 entry 属性,来指定一个(或多个)不同的入口起点。
    例如:
    webpack.config.js
      module.exports = {
        //单入口
        entry: './path/to/my/entry/file.js',
        //多入口
        entry: {
          app: './src/app.js',
          adminApp: './src/adminApp.js'
        }
      };

  2.输出(output)

    output 属性告诉 webpack 在哪里输出它所创建的 bundle,以及如何命名这些文件
    主要输出文件认值是 ./dist/main.js,其他生成文件认放置在 ./dist 文件夹中。
    你可以通过在配置中指定一个 output 字段,来配置这些处理过程:
    webpack.config.js
      const path = require('path');
      module.exports = {
        entry: './path/to/my/entry/file.js',
        output: {
          //filename: 'my-first-webpack.bundle.js',
          filename: './js/my-first-webpack.bundle.js',
          path: path.resolve(__dirname, 'dist'),
        }
      };
      path 模块是什么,它是一个 Node.js 核心模块,用于操作文件路径。resolve()用来拼接路径

  3.loader

    webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。
    loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。
      在更高层面,在 webpack 的配置中,loader 有两个属性
        test 属性,识别出哪些文件会被转换。
        use 属性,定义出在进行转换时,应该使用哪个 loader。
      webpack.config.js
      const path = require('path');
      module.exports = {
        output: {
          filename: 'my-first-webpack.bundle.js'
        },
        module: {
          rules: [
            {
              test: /\.html$/,
              use: 'html-loader'
            }
          ]
        }
      };

  4.插件(plugin)

    loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。
    想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。
    多数插件可以通过选项(option)自定义
    你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例。
    webpack.config.js
      const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
      const webpack = require('webpack'); // 用于访问内置插件
      module.exports = {
        module: {
          rules: [
            { test: /\.txt$/, use: 'raw-loader' }
          ]
        },
        plugins: [
          new HtmlWebpackPlugin({template: './src/index.html'})
        ]
      };
      在上面的示例中,html-webpack-plugin 为应用程序生成 HTML 一个文件,并自动注入所有生成的 bundle。

  5.模式(mode)

    通过选择 development, production 或 none 之中的一个,来设置 mode 参数,你可以启用 webpack 内置在相应环境下的优化。
    其认值为 production。

  6.entry入口

    在webpack.config.js文件
      module.exports = {
        //单入口
        //entry:'./src/js/index.js',
        //多入口
        entry: {
          index: './src/js/index.js',
          index2: './src/js/index2.js'
        },
      }

  7.output输出

    在webpack.config.js文件
      const {resolve} = require('path');
      module.exports = {
        output: {
          //单出口
          //filename: './js/built-dev.js',
          //多出口
          filename: './js/[name]-built-dev.js',
          // 输出路径写绝对路径
          // __dirname nodejs的变量,代表当前文件的目录的绝对路径
          path: resolve(__dirname, 'build')
        }
      }

  8.loader module

    在webpack.config.js文件
      module.exports = {
        module:[
          //loader的配置
          ....
        ]
      }

  9.转义js文件,排除node_modules中的文件

    babel-loader
    安装 cnpm i -D @babel/core @babel/preset-env babel-loader
    配置
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }

  10.css文件

    style-loader
    css-loader
    安装  cnpm i -D style-loader css-loader
    配置
      {
        // 检测  匹配哪些文件 值为正则表达式
        test: /\.css$/,
        // 使用哪些loader对文件进行处理
        use: [
          // use数组中的执行顺序:从右到左,从下到上
          // 创建一个style标签,将js中的css样式资源插入进去,添加页面head中生效
          "style-loader",
          // 将css文件变成commonjs的模块,加载到js中,里面内容是样式字符串
          "css-loader",
        ]
      }

  11.less文件(less-loader依赖less)

    style-loader
    css-loader
    less-loader
    安装 cnpm i -D style-loader css-loader less-loader less
    配置
      {
        test: /\.less$/,
        use: [
          // 创建style标签添加到head中
          'style-loader',
          //将css处理成模块,整合到js中
          'css-loader',
          // 将less文件编译成css文件  需要下载less-loader 和less
          'less-loader'
        ]
      }

  12.less和css中的图片使用,不处理html中的img

    1.url-loader(url-loader依赖file-loader)
      安装
        cnpm i -D url-loader file-loader
      配置
        {
          test: /\.(JPG|jpg|png|gif)$/,
          // 下载url-loader和file-loader   url-loader依赖file-loader
          use: 'url-loader',
          options: {
            //设置输出文件目录路路径
            outputPath: 'images',
            // 图片大小小于8kb,就会被base64处理, 8-12kb以下图片base64处理
            // base64优点:减少请求数量(减轻服务器压力)
            // base64缺点:图片体积会更大(文件请求速度会更慢)
            limit: 8 * 1024,
            // 给图片进行重命名  
            // [hash:10]  取图片的hash的前10位
            // [ext]取图片原来扩展名
            name: '[hash:10].[ext]',
          }
        }
    2.或者file-loader(file-loader不会使用base64处理小文件,原文件会保留)
      安装
        cnpm i -D url-loader file-loader
      配置
        {
          test: /\.(JPG|jpg|png|gif)$/,
          use: [
            {
              loader: 'file-loader',
              options: {
                // 设置图片输出文件路径
                outputPath: 'images'
              }
            }
          ],
        }

  13.html中的img图片使用

    html-loader(处理html中的image图片的,负责引入img,从而能被url-loader处理)
    安装 cnpm i -D html-loader
    配置
      {
        test: /\.html$/,
        use: 'html-loader'
      },
    其他文件(比如:字体文件
      排除之前已经loader配置过的文件
      file-loader
      安装 cnpm i -D file-loader
      配置
        {
          exclude: /\.(html|js|less|css|png|jpg|gif|json)$/,
          loader: 'file-loader',
          options: {
            name: "[hash:10].[ext]",
            outputPath: 'media'
          }
        }

  14.plugin的配置

    在webpack.config.js文件
      module.exports = {
        plugins:[
          //插件的配置  插件实例
          ....
        ]
      }

  15.第三方插件自动生成bundle的html文件

    html-webpack-plugin
    安装 cnpm i -D html-webpack-plugin
    引入 const HTMLWebpackPlugin = require('html-webpack-plugin');
    配置:
      在出口目录中生成认html文件
        new HTMLWebpackPlugin()
      或者在出口目录中生成指定模板html文件
      new HTMLWebpackPlugin({
        // 指定一个html文件,在改html文件中不需要引入出口js文件,会自动引入
        template: './src/main.html'
      })

  16.源映射source maps

    source maps可以准确定位错误出现在具体哪个模块中
    source-map提供一种技术,提供源代码到构建后的代码的映射的技术,如果构建后代码出错了,
    通过映射关系可以追踪到源代码错误,利于调试和找错误,使用webpack命令会生成xxx.map文件
        inline-source-map 内联,构建速度更快,只生成一个内联source-map
        hidden-source-map 外部
        eval-source-map   内联,每一个文件生成一个对应的source-map,都在eval
    配置:
      在webpack.config.js文件
      module.exports = {
        devtool: 'inline-source-map'
      }

  17.mode 模式

    在webpack.config.js文件
      module.exports = {
        // 模式配置  开发模式
        mode: 'development',
        // 模式配置  生产模式  压缩代码
        // mode: 'production',
      }

  18.webpack-dev-server 开发服务器

    webpack-dev-server是一个简单的web服务器,在代码修改后能重新构建代码并且刷新浏览器
    自动化,自动编译,自动打开浏览器,自动刷新浏览器
    特点:只会在内存中编译打包,不会有任何实体文件输出
    启动devServer指令为 webpack-dev-server   
    本地下载的话需要npx webpack-dev-server查找包并运行,可以将该命令配置到package.json中
    安装 cnpm i -D webpack-dev-server
    配置:
      在webpack.config.js文件
      module.exports = {
        devServer: {
          // 运行的构建后的目录
          static: './build',
          // 启动gzip压缩
          compress: true,
          // 端口号,认是8080
          port: 3000,
          // 是否自动打开浏览器
          open: true
        }
      }

相关文章

一准备工作umi为react的一个封装比较nice的脚手架。优点当然...
webpack在引入两个依赖的包时,可能需要使用shimming,意思是...
  Happypack (plugin)多线程使用loader编译文件treeshaki...
一目录结构├──build//构建相关├──config//配置相关├─...
接着第一节的demo现在我们尝试整合一些其他资源,比如图像,...
webpack的打包原理识别入口文件通过逐层识别模块依赖(Common...