你可以看懂的webpack5知识(上)

简介: 你可以看懂的webpack5知识

webpack介绍


webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。是一种前端构建工具。


webpack 五个核心概念


Entry


入口(Entry):指示 webpack 以哪个文件为入口起点开始打包,分析构建内部依赖图。


Loader


Loader:让 webpack 能够去处理那些非 JS 的文件 / json资源,比如样式文件、图片文件(webpack 自身只理解 JS)


Plugins


插件(Plugins):可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩, 一直到重新定义环境中的变量等。


Mode


模式(Mode):指示 webpack 使用相应模式的配置。


  • development:生产模式,能让代码在本地进行调试运行的环境


  • production:能让代码在线上优化上线的运行环境。


Output


输出(Output):指示 webpack 打包后的资源 bundles 输出到哪里去,以及如何命名。


简单的webpack打包测试


网络异常,图片无法展示
|


打包js, json文件


import data from './demo.json';
// 引入非js,json资源,进行打包会报错,所以需要通过loader来使webpack可以打包非js,json的资源。
// import "./index.css";
console.log("=========", "我是index.js文件");
console.log(data)
// webpack ./src/index.js -o ./build/built.js --mode=development 
// 打包js,json文件不会报错


结论:


  1. webpack能处理js/json资源,不能处理其他资源。


  1. 生产环境和开发环境都能将 es6 的模块化语法转换成浏览器能识别的语法。


  1. 生产环境会压缩打包的js代码。


网络异常,图片无法展示
|


让webpack支持css的打包


use 数组中 loader 执行顺序:从右到左,从下到上 依次执行


'style-loader', 创建 style 标签,将 js 中的样式资源插入进行,添加到 head 中生效 。


'css-loader' ,将 css 文件变成 commonjs 模块加载 js 中,里面内容是样式字符串 。


// 处理css文件
{
  // 这里表示匹配的文件,都需要通过该loader转化。
  test: /.css$/,
    // 需要使用到的loader,从后往前执行
    use: [
      // 创建 style 标签,将 js 中的样式资源插入进行,添加到 head 中生效 。
      'style-loader',
      // 将 css 文件变成 commonjs 模块加载 js 中,里面内容是样式字符串 。
      'css-loader'
    ]
},


网络异常,图片无法展示
|


让webpack支持sass的打包


注意:这里需要下载sass和sass-loader两个包,不然报‘cannot find module sass’


// 处理sass文件
{
  test: /.scss$/,
    use: [
      'style-loader',
      'css-loader',
      'sass-loader'
    ]
}


让webpack支持打包html资源


安装插件 html-webpack-plugin。而且需要引入才能使用。


默认创建一个空的html文件,然后引入打包后的js文件。


如果想要指定html模板,需要传入template属性。指定模板的路径。


// 引入html打包插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]


让webpack支持打包图片资源


在 webpack5+,以上方法已经过时了,webpack5 使用了“资源模块”来代替以上 loader。 官方是这样解释“资源模块”的。


资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。


  • asset/resource: 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。


  • asset/inline: 导出一个资源的 data URI。之前通过使用 url-loader 实现。


  • asset/source: 导出资源的源代码。之前通过使用 raw-loader 实现。


  • asset: 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。 具体访问juejin.cn/post/697033…处理样式中图片的方式


问题:默认处理不了 html 中 img 图片


// 方式一
 {
   test: /.(jpe?g|png|svg|gif)/i,
     type: 'asset/resource',
 },
// 方式二
  // 这个是处理样式中引入的图片资源
  {
    test: /.(png|gif|jpg|jpeg)/,
      use: [
        {
          loader: "url-loader",
          options: {
            // 优点: 减少请求数量(减轻服务器压力) // 缺点:图片体积会更大(文件请求速度更慢) 
            limit: 8 * 1024, // 指定图片最大多少时转为base64格式。就是小于这个就被转化
            name: '[name].[hash:10].[ext]',// 重命名文件
            outputPath: 'static/img',// 文件的输出位置
            esModule: false, // 这里需要将esModule关闭,因为他与commonjs模块化冲突
          }
        }
      ],
        type: 'javascript/auto'
  },


处理html中引入的图片


他的作用是处理html中的img,然后交给url-loader处理。


// 这个是处理html中引入的图片资源
{
  test: /.html$/,
    loader: 'html-loader'
}


让webpack支持打包其他资源


file-loader


// 打包其他资源(除了 html/js/css 资源以外的资源) 
{ // 排除 css/js/html 资源 
  exclude: /.(css|js|html|sass|json|png|gif|jpg|jpeg)$/,
    loader: 'file-loader',
      options: { name: '[hash:10].[ext]' }
}


可是自己测试,如果引入字体图标。然后webpack会指定打包,不需要使用file-loader。


url-loader和file-loader的区别:前者是将非文本小文件转化为base64 URI。减少对服务器的请求。


开发环境中的完整配置


const { resolve } = require("path")
// 引入html打包插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  entry: "./src/js/index.js",
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      // 处理css文件
      {
        // 这里表示匹配的文件,都需要通过该loader转化。
        test: /.css$/,
        // 需要使用到的loader,从后往前执行
        use: [
          // 创建 style 标签,将 js 中的样式资源插入进行,添加到 head 中生效 。
          'style-loader',
          // 将 css 文件变成 commonjs 模块加载 js 中,里面内容是样式字符串 。
          'css-loader'
        ]
      },
      // 处理sass文件
      {
        test: /.(scss|sass)$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },
      // 处理图片 方式一
      // {
      //   test: /.(jpe?g|png|svg|gif)/i,
      //   type: 'asset/resource',
      // },
      // 这个是处理样式中引入的图片资源 方式二
      {
        test: /.(png|gif|jpg|jpeg)/,
        use: [
          {
            loader: "url-loader",
            options: {
              limit: 8 * 1024,
              name: '[name].[hash:10].[ext]',
              outputPath: 'static/imgs',
              esModule: false,
            }
          }
        ],
        type: 'javascript/auto'
      },
      // 这个是处理html中引入的图片资源
      {
        test: /.html$/,
        loader: 'html-loader'
      },
      // 打包其他资源(除了 html/js/css 资源以外的资源) 
      { 
        // 排除上面处理后的文件资源
        exclude: /.(css|js|html|sass|json|png|gif|jpg|jpeg)$/,
        loader: 'file-loader',
        options: { name: '[hash:10].[ext]', outputPath: "static/others" }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
  // 使用的模式
  mode: 'development',
  devServer: { 
      // 项目构建后路径 。当我们在打包后的资源中,引入的文件中,未能在打包后的资源中找到,就会在contentBase指定的文件夹中查找。在开发阶段方便打包。不需要使用copyWebpackPlugin插件将资源复制到打包后的资源中。
    contentBase: resolve(__dirname, 'build'),
    // 启动 gzip 压缩 
    compress: true,
    // 端口号 
    port: 3000,
    // 自动打开浏览器 
    open: true
  }
}


相关文章
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验04-HDFS文件创建与写入
【大数据开发技术】实验04-HDFS文件创建与写入
663 0
【密码学】一文读懂SHAMIR门限方案
【密码学】一文读懂SHAMIR门限方案
1805 0
【密码学】一文读懂SHAMIR门限方案
|
存储 Kubernetes Cloud Native
【云原生|K8s系列第3篇】:实战Kubectl创建Deployment部署应用
本期文章是K8s第3篇,主要是实战Kubectl创建Deployment部署应用。通过本期文章:我们将学习创建在 Kubernetes 集群上运行应用程序的 Deployment 所需的最常见的 Kubectl 命令。
【云原生|K8s系列第3篇】:实战Kubectl创建Deployment部署应用
|
11月前
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `<button>` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
585 77
|
前端开发
自定义 Hook 编写指南
【10月更文挑战第15天】本文介绍了 React 中的 Hooks 和自定义 Hook 的基本概念、编写方法及常见问题。通过具体代码示例,详细讲解了如何在函数组件中使用状态和其他 React 特性,并分享了避免常见错误的技巧。自定义 Hook 可以帮助你将组件中的逻辑提取出来,使其更加可重用和可维护。
757 68
|
缓存 安全 UED
网站图片缓存设置不当可能会导致哪些问题?
【10月更文挑战第18天】网站图片缓存的合理设置至关重要,需要综合考虑图片的性质、更新频率、用户体验、服务器性能等多方面因素,以避免出现上述各种问题,确保网站的正常运行和用户信息的安全。
|
7月前
|
JavaScript 前端开发 Java
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
210 24
JavaScript:编程宇宙的多面闪耀之星-揭秘 JavaScript,编程界的全能霸主如何炼成?-优雅草卓伊凡
|
9月前
|
小程序 搜索推荐
2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
线下陪玩约玩APP旨在满足现代人的社交、兴趣分享、专业指导及休闲娱乐需求。用户可通过平台结识新朋友、找到志同道合的伙伴,并享受高质量的陪玩服务。平台提供用户注册登录、陪玩师筛选与预约、实时沟通等功能,支持个性化游戏体验和高效匹配。
478 0
2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
|
SQL 存储 数据库
实验4:SQL视图操作技巧与方法
在数据库管理系统中,视图(View)是一种虚拟表,它基于SQL查询的结果集创建,并不实际存储数据

热门文章

最新文章