首页 > 其他分享 >前端面试题 — webpack

前端面试题 — webpack

时间:2024-04-15 15:58:12浏览次数:25  
标签:npm 文件 面试题 前端 loader webpack 模块 css

1.webpack的安装和使用方式

  • 安装 Node.js 和 npm

    首先,确保你的计算机上安装了 Node.js 和 npm(Node 包管理器),因为 Webpack 是通过 npm 进行安装和管理的。

  • 创建项目目录并初始化 npm

    npm init -y

  • 安装 Webpack

    npm install webpack webpack-cli --save-dev

  • 创建 webpack 配置文件

    在项目根目录下创建一个名为 webpack.config.js 的文件,这是 Webpack 的配置文件,用来指示 Webpack 如何打包项目中的文件。

  • 运行打包命令

    npx webpack

2.webpack的热更新原理

  • 模块热替换(Hot Module Replacement):

    Webpack 的热更新基于模块热替换技术。它允许在应用程序运行过程中替换、添加或删除模块,而无需完全刷新页面。这种替换是在运行时进行的,可以使应用程序保持在当前状态下重新加载所需的部分。

  • HMR Runtime(热更新运行时):

   Webpack 会在构建过程中生成一个称为 HMR Runtime 的代码块。这段代码在运行时与应用程序一起加载,并通过 WebSocket 与开发服务器保持连接。HMR Runtime 负责管理模块热替换的逻辑。

  • 监视文件变化:

   在开发模式下,Webpack 会监视项目中各个文件的变化。当开发者保存文件时,Webpack 检测到文件发生变化,并触发重新编译过程。

  • 构建更新的模块:

   在重新编译过程中,Webpack 会确定哪些模块发生了变化,并构建更新的模块。这些更新的模块并不会替换现有的模块,而是生成一个更新的版本。

  • HMR 接口:

   HMR Runtime 与开发服务器建立了 WebSocket 连接,并通过 HMR 接口通信。当构建完成并生成了更新的模块时,Webpack 会将更新的模块信息通过 HMR 接口发送给 HMR Runtime。

  • 热更新处理:

   HMR Runtime 接收到更新的模块信息后,会根据更新的模块执行相应的操作。这可能涉及替换现有的模块、添加新模块或删除不再需要的模块。这样,应用程序的状态就得到了实时更新,而不需要完全刷新页面。

 

总的来说,Webpack 的热更新利用了模块热替换技术和 HMR Runtime,通过监视文件变化、构建更新的模块,并通过 WebSocket 与开发服务器进行通信,实现了代码的实时更新和页面局部刷新,提高了开发效率和体验。

3.webpack的常用loader

babel-loader:用于将ES6+的JavaScript代码转换为ES5代码,以便在旧版本浏览器中运行。

css-loader:用于解析CSS文件,并处理其中的import和url()等语法。

style-loader:将解析后的CSS代码以<style>标签的形式插入到HTML文件中。

file-loader:用于处理文件资源(如图片、字体等),并将其复制到输出目录中。

url-loader:类似于file-loader,但可以根据文件大小将文件转换为DataURL,以减少HTTP请求。

sass-loader:用于将Sass/SCSS代码转换为CSS代码。

less-loader:用于将Less代码转换为CSS代码。

postcss-loader:用于对CSS代码进行后处理,如自动添加浏览器前缀等。

vue-loader:用于解析和转换Vue单文件组件。

ts-loader:用于将TypeScript代码转换为JavaScript代码。

4.webpack的常用plugin以及作用

HtmlWebpackPlugin:
自动生成 HTML 文件,并将打包后的 JavaScript 或 CSS 文件自动引入到 HTML 文件中。可配置参数包括模板文件、输出文件名、压缩选项等。

MiniCssExtractPlugin:
将 CSS 提取为单独的文件,并进行压缩和优化。通常与 CSS 相关的 loader 结合使用,如 style-loader、css-loader 等。

CleanWebpackPlugin:
在每次构建之前清理输出目录(如 dist 目录),避免旧文件的累积。通常用于生产环境构建。

DefinePlugin:
允许在编译时创建全局常量,可用于注入环境变量,例如配置开发环境和生产环境下的不同行为。

CopyWebpackPlugin:
将文件或目录复制到构建输出目录,常用于复制静态资源文件,如图片、字体等。

OptimizeCssAssetsPlugin:
用于优化和压缩 CSS 文件。通常与 MiniCssExtractPlugin 结合使用,用于生产环境构建。

WebpackBundleAnalyzer:
分析打包文件的大小和依赖关系,可视化构建结果,帮助优化代码和资源。

ProvidePlugin:
自动加载模块,而不必到处 import 或 require。可以将全局变量注入到每个模块中,如将 jQuery 注入到每个模块中,使其无需手动引入。

CompressionWebpackPlugin:
在构建过程中对资源文件进行 gzip 压缩,以减小文件体积,提高加载速度。

HotModuleReplacementPlugin:
启用模块热替换(HMR)功能,实现代码修改后的实时更新,提高开发效率。
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
        ],
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: [
          'file-loader',
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      filename: 'index.html',
    }),
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css',
    }),
    new CleanWebpackPlugin(),
  ],
};

5.webpack的配置

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 自动引入资源插件  npm install --save-dev html-webpack-plugin
const MiniCssExtracPlugin = require("mini-css-extrac-plugin"); // css抽离
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");  //css压缩 npm install css-minimizer-webpack-plugin  --save-dev 
const TerserPlugin = require("terser-webpack-plugin"); // js压缩  npm install --save-dev terser-webpack-plugin
//加载toml、yarm、json5数据资源 npm install toml yarm json5 -D
const toml = require("toml");
const yarm = require("yarm");
const json5 = require("json5");

module.exports = (env) => {
  return {
    // 手动分离公共文件,通过配置成对象的方式实现多入口代码分割
    // entry: {
    //  index:{
    //    import:"./src/index.js",
    //    dependOn: "shared"  // 抽离公共文件
    //  },
    //  shared: "lodash"      // 公共的js文件
    // },
    // 多入口
      // entry: {
    //      pageOne: './src/pageOne/index.js',
    //      pageTwo: './src/pageTwo/index.js',
    //      pageThree: './src/pageThree/index.js',
      // },
    // 单入口
    entry: {
      index: "./src/index.js",
    },
    output: {
      filename: "scripts/[name].[contenthash].js", // 将所有的js放入同一个文件夹,并且根据文件名自动命名
      path: path.resolve(__dirname, "./dist"),
      clean: true, // 清除上一次的垃圾文件
      assetModuleFilename: "images/[contenthash][ext]", // 在images目录下,根据文件内容自动生成hash文件名
      publicPath: "https://*****.com/", // 公共路径(cdn域名或者本地localhost)
    },
    mode: env.prodection ? "prodection" : "development", // 生产环境或者开发环境 package.json 启动命令:npx webpack --env prodection
    devtool: "cheap-module-source-map",     // 真实报错文件指向,生产环境一般不开启sourcemap
    // 插件(非必要的,缺少也不影响项目打包)
    plugins: [
      new HtmlWebpackPlugin({
        template: "./index.html", // 模板
        filename: "app.html",
        inject: "body", // script 存在的位置
        hash: true, // 解决缓存
        minify: {
          removeAttributeQuotes: true, // 压缩,去掉引号
        },
      }),
      new MiniCssExtracPlugin({
        filename: "style/[contenthash].css",
      }),
    ],
    devServer: {
      static: "./dist", // 监听根目录文件变化,自动刷新页面插件 npm install --save-dev webpack-dev-server
      //反向代理
      proxy: {
        "/ajax": {
          target: "https:**********",
          ws: true,
          changeOrigin: true,
        },
      },
    },
    // 模块(必要的,缺少影响项目打包)
    module: {
      rules: [
        //资源模块类型我们称之为Asset Modules Type,总共有四种,来代替loader,分别是:
        // asset/resource:发送一个单独的文件并导出URL,替代file-loader
        // asset/inline:导出一个资源的data URI(base64),替代url-loader
        // asset/source:导出资源的源代码,之前通过使用raw-loader实现
        // asset:介于asset/resource和asset/inline之间, 之前通过url-loader+limit属性实现。
        {
          test: /\.(png|gif|jp?g|svg|webp|ico)$/, // 正则图片文件
          type: "asset",
          generator: {
            filename: "images/[contenthash][ext]", // 优先级高于 assetModuleFilename
          },
        },
        {
          // 支持less
          // npm install style-loader css-loader less-loader less --save-dev
          // 抽离 npm install mini-css-extrac-plugin  --save-dev   webpack5环境下构建的插件
          test: /\.(le|c)ss$/, // .less and .css
          use: [MiniCssExtracPlugin.loader,/* "style-loader", */ "css-loader","less-loader"],
        },
        {
          test: /\.(woff|woff2|eot|ttf|oft)$/, // 正则字体文件
          type: "asset/resource",
        },
        //加载csv、xml数据资源 npm install csv-loader xml-loader -D
        {
          test: /\.(csv|tsv)$/,
          use: "csv-loader",
        },
        {
          test: /\.xml$/,
          use: "xml-loader",
        },
        //加载toml、yarm、json5数据资源
        {
          test: /\.toml$/,
          type: "json",
          parser: {
            parse: toml.parse,
          },
        },
        {
          test: /\.yarm$/,
          type: "json",
          parser: {
            parse: yarm.parse,
          },
        },
        {
          test: /\.json5$/,
          type: "json",
          parser: {
            parse: json5.parse,
          },
        },
        // loader工具 支持数组方式链式调用,数组靠后的元素先执行
        {
          // 压缩图片
          //图片小于一定大小使用base64 否则使用file-loader产生真实图片 npm install url-loader --save-dev
          test: /\.(png|gif|jp?g|svg|webp|ico)$/, // 正则
          use: [
            {
              loader: "url-loader",
              options: {
                limit: 5000, //小于限定使用base64
                name: "home/images/[name].[hash:8].[ext]",
                publicPath: `../../`,
                esModule: false,
              },
            },
          ],
        },
        // 使用babel-loader npm install -D babel-loader @babel/core @babel/preset-env
        // regeneratorRuntime是webpack打包生成的全局辅助函数,由babel生成,用于兼容 async/await 的语法
        // npm install --save @babel/runtime
        // npm install --save-dev @babel/plugin-transform-runtime
        {
          test: /\.js$/,
          exclude: /node_modules/, // *业务代码里面可能会引入node_modules外部js,这些js不需要babel-loader编译,因此需要排除掉
          use: {
            loader: "babel-loader", // *引入babel-loader
            options: {
              presets: ["@babel/preset-env"], // *引入预设
              plugins: [
                [
                  "@babel/plugin-transform-runtime", // *配置插件信息
                ],
              ],
            },
          },
        },
      ],
    },
    optimization: {
      minimizer: [new CssMinimizerPlugin(),new TerserPlugin()],   //代码压缩 mode改为 production
      splitChunks: {
        // 缓存
        cacheGroups: {
          vendor: {
            test: /[\\/]node_modules[\\/]/,
            name: "vendors",
            chunks: "all", // 自动重复代码抽离
          },
        },
      },
    },
  };
};

 

标签:npm,文件,面试题,前端,loader,webpack,模块,css
From: https://www.cnblogs.com/qinlinkun/p/18136107

相关文章

  • 若依解决VUE前端时间显示问题
    参考:https://blog.csdn.net/qq_43544074/article/details/119139313#:~:text=%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%98%BE%E7%A4%BA%E6%97%B6%E9%97%B4%E3%80%82%20%E8%A7%A3%E5%86%B3%E5%A6%82%E4%B8%8B%EF%BC%9A%201%E3%80%81%E5%9C%A8%E5%90%8E%E7%AB%AF%E4%BB......
  • 纯前端实现发版版本变化后页面重新加载
    0.原理通过在前端静态文件目录下维护一个版本,首次进入页面存储当前版本,轮询查询静态文件版本是否发生变化,如果变化则重新加载页面,如果未变化,则继续轮询1.优点比通过后端维护在数据库版本进行查询消耗更小,不需要查询数据库,也不用走到后台代码层,只需要访问到ngxin/......
  • gitee基于webhooks实现前端简单自动化部署
    1.为什么采用自动化部署简而言之,程序员优秀传统:懒=>高级生产力.基于gitee进行的自动化部署,服务器环境为Ubuntu基于webhooks进行的自动化部署更加轻快便捷2.部署步骤1).服务器购买可以购买阿里云抢占式服务器进行实验,花费应该在一大洋以内,或者直接购买一年低配服务......
  • 前端小白学习路线与方法推荐
    0.编辑器推荐1).WebStorm优点:本身功能丰富缺点:体积较大,需要破解,或者购买正版2)VsCode优点:轻量,开源免费缺点:需要插件扩展,才能达到Webstorm的很多功能推荐插件:书写标签,自动补全标签给代码添加颜色,使代码更加易于区分可以直接运行js代码,而不用通过html......
  • [转]写给前端的 react-native 入门指南
    前言本文主要介绍react-native(下称RN)的入门,和前端的异同点文章不涉及功能的具体实现选择优势我们先说说,为什么很多人会选择使用RN、他对应的特性和普通Web的区别前端资源,生态的互通因为使用的语言是JS和react,对于前端来说可以无缝切换,并且他还能......
  • 简单了解前端性能监控
    作为一名开发来讲,以下场景你有没有遇到:点击这个按钮怎么没反应了页面为什么白了怎么一直正在加载很多用户说图片加载不出来......那么有一款性能监控产品太重要了,但是性能相关的东西实在太多了。那么从一个熟悉又陌生的api开始,performance。1.什么是performancemdn上是......
  • 上海携程java高级面试题(一)
    一、JVM加载Class文件的原理机制?在面试java工程师的时候,这道题经常被问到,故需特别注意。Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式......
  • 未来的前端框架技术发展趋势
    ​福利开篇推荐老铁们,你们是否平常开发有这样的问题:1.需要公网访问内网的一个服务?2.需要一个开发环境直接支持https,但是弄本地证书既不合法,又很麻烦?3.本地有强劲的服务器,需要对公网提供服务,但是拉宽带既贵,又麻烦?4.有云主机,但同时云主机需要访问内部的服务器?5.......
  • 大公司的Java面试题集
    找工作要面试,有面试就有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM,E*Trade,Siebel,Motorola,SUN, 以及其它大小公司。面试是没什么道理可讲的,它的题目有的不合情理、脱离实际。有在纸上写的,有当面考你的,也有在电话里问的,给你IDE的......
  • 42 Typescript编译配置-webpack-babel
    TS编译配置自动编译单个文件tsc1.ts#如果想要自动监视文件的变化,需要添加`-W`配置tsc1.ts-W自动编译整个项目初始化,会自动生成一个tsconfig.json文件,然后直接执行tsc命令,就可以对当前目录的所有ts文件进行编译,生成对应的js文件#初始化项目tsc--init#编译......