前端必会题库

105 阅读35分钟

Webpack题库

单选题

1. 以下关于 webpack 的说法,正确的是( )

A. webpack 只能用于打包 JavaScript 文件
B. webpack 是一个前端项目的自动化构建工具
C. webpack 主要用于后端项目的部署
D. webpack 只适用于 React 项目

答案:B

解析

  • 选项 A:Webpack 不仅可以打包 JavaScript 文件,还能处理 CSS、图片、字体等各种类型的文件,通过使用不同的 loader 可以将这些文件转换为 Webpack 能够处理的模块。
  • 选项 B:Webpack 是一个强大的前端自动化构建工具,它可以处理模块打包、代码分割、资源优化等一系列前端开发中的常见任务,帮助开发者更高效地管理和构建前端项目,所以该选项正确。
  • 选项 C:Webpack 主要用于前端项目的构建和打包,和后端项目的部署没有直接关系。后端项目部署通常涉及服务器配置、数据库管理等操作。
  • 选项 D:Webpack 是一个通用的前端构建工具,并不局限于 React 项目,它可以用于 Vue、Angular 等各种前端框架的项目,甚至是没有使用框架的纯 HTML、CSS、JavaScript 项目。

2. webpack 的核心概念中,负责将不同类型的文件转换为有效的模块的是( )

A. entry
B. output
C. loader
D. plugin

答案:C

解析

  • 选项 A:entry 是 Webpack 的入口起点,它告诉 Webpack 从哪个文件开始构建依赖图,它定义了打包的起始点,而不是进行文件转换。
  • 选项 B:output 用于指定 Webpack 打包后的文件输出位置和文件名,它控制着打包结果的输出路径和格式,与文件转换无关。
  • 选项 C:loader 是 Webpack 中用于处理不同类型文件的转换器,它可以将 CSS、图片、字体等非 JavaScript 文件转换为 Webpack 能够处理的模块,从而让 Webpack 可以对这些文件进行打包和处理,所以该选项正确。
  • 选项 D:plugin 用于扩展 Webpack 的功能,它可以在 Webpack 构建过程的不同阶段执行特定的任务,如压缩代码、生成 HTML 文件等,但不负责文件类型的转换。

3. webpack 中默认的入口文件是( )

A. index.js
B. main.js
C. app.js
D. entry.js

答案:A

解析:在没有特别配置入口文件的情况下,Webpack 默认会从 src/index.js 作为入口文件开始构建项目的依赖图。所以选项 A 正确。

多选题

1. 以下哪些属于 webpack 的核心概念( )

A. entry
B. output
C. loader
D. plugin

答案:ABCD

解析

  • entry:指定 Webpack 开始构建依赖图的入口文件,是整个打包过程的起点。
  • output:定义了 Webpack 打包后的文件输出位置和文件名,决定了打包结果的存储方式。
  • loader:用于处理不同类型的文件,将其转换为 Webpack 能够处理的模块,使 Webpack 可以处理多种资源。
  • plugin:扩展 Webpack 的功能,在 Webpack 构建的不同生命周期阶段执行各种任务,如优化代码、生成 HTML 等。这四个都是 Webpack 的核心概念,所以全选。

2. 以下哪些 loader 可以用于处理样式文件( )

A. css-loader
B. sass-loader
C. less-loader
D. style-loader

答案:ABCD

解析

  • css-loader:用于解析 CSS 文件中的 @import 和 url() 等语句,将 CSS 文件转换为 JavaScript 模块,让 Webpack 可以处理 CSS 文件。
  • sass-loader:用于处理 Sass 或 Scss 文件,将其编译为普通的 CSS 文件,配合其他 loader 可以完成对 Sass 文件的打包。
  • less-loader:和 sass-loader 类似,用于处理 Less 文件,将 Less 代码编译为 CSS 代码。
  • style-loader:将 CSS 代码以 <style> 标签的形式插入到 HTML 文件中,让样式可以在页面中生效。所以这四个 loader 都可以用于处理样式文件。

3. 以下哪些插件是 webpack 中常用的( )

A. HtmlWebpackPlugin
B. CleanWebpackPlugin
C. MiniCssExtractPlugin
D. UglifyJsPlugin

答案:ABCD

解析

  • HtmlWebpackPlugin:用于生成 HTML 文件,并自动将打包后的 JavaScript 和 CSS 文件引入到 HTML 文件中,简化了 HTML 文件的管理和更新。
  • CleanWebpackPlugin:在每次构建前清理输出目录,确保输出目录中只包含最新的打包文件,避免旧文件的干扰。
  • MiniCssExtractPlugin:将 CSS 代码从 JavaScript 中提取出来,生成单独的 CSS 文件,提高页面的加载性能。
  • UglifyJsPlugin:用于压缩和混淆 JavaScript 代码,减小文件体积,提高代码的安全性和加载速度。所以这些都是 Webpack 中常用的插件。

简答题

1. 简单描述一下 webpack 的工作原理

答案:Webpack 是一个模块打包工具,其工作原理如下:

  • 入口解析:Webpack 从配置文件中指定的入口文件开始,分析该文件的依赖关系。它会递归地查找入口文件及其依赖模块中引入的其他模块,形成一个完整的依赖图。
  • 模块处理:对于依赖图中的每个模块,Webpack 根据配置的 loader 对其进行处理。不同类型的文件(如 CSS、图片、JavaScript 等)会使用相应的 loader 进行转换,将它们转换为 Webpack 能够处理的模块格式。
  • 打包输出:Webpack 将处理后的所有模块打包成一个或多个 bundle 文件。这些 bundle 文件包含了项目中所有的代码和资源。最后,根据配置的输出选项,将打包后的文件输出到指定的目录中。

2. 简述 webpack 中 loader 和 plugin 的区别

答案

  • 功能定位

    • loader:主要用于对模块的源代码进行转换。它可以将不同类型的文件(如 CSS、图片、TypeScript 等)转换为 Webpack 能够处理的模块,解决 Webpack 本身只能处理 JavaScript 模块的局限性。
    • plugin:用于扩展 Webpack 的功能,在 Webpack 构建过程的不同生命周期阶段执行特定的任务,如代码压缩、生成 HTML 文件、资源优化等。
  • 使用方式

    • loader:在 Webpack 配置文件的 module.rules 中进行配置,通过 test 匹配文件类型,然后使用 use 指定要使用的 loader,并且 loader 支持链式调用,按照从右到左的顺序依次执行。
    • plugin:在 Webpack 配置文件的 plugins 数组中进行配置,需要先引入插件,然后创建插件的实例并添加到 plugins 数组中。
  • 执行时机

    • loader:主要在模块的加载和转换阶段执行,针对每个模块进行处理。
    • plugin:可以在 Webpack 构建的整个生命周期中执行,监听 Webpack 广播的各种事件,在特定的事件触发时执行相应的操作。

3. 如何使用 webpack 实现代码分割

答案:在 Webpack 中可以通过以下几种方式实现代码分割:

  • 入口起点:通过配置多个入口点来实现代码分割。在 Webpack 配置文件的 entry 中指定多个入口文件,Webpack 会为每个入口文件生成一个独立的 bundle 文件。例如:
module.exports = {
  entry: {
    index: './src/index.js',
    about: './src/about.js'
  },
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

这样会生成 index.bundle.js 和 about.bundle.js 两个独立的文件。

  • 动态导入(import() :使用 ES6 的动态导入语法 import() 可以实现按需加载模块。当代码执行到 import() 语句时,Webpack 会自动将该模块分割成一个单独的 chunk,并在需要时异步加载。例如:
// 在需要的地方动态导入模块
button.addEventListener('click', () => {
  import('./module').then(({ default: module }) => {
    // 使用导入的模块
    module.doSomething();
  });
});
  • SplitChunksPlugin:Webpack 4 及以上版本内置了 SplitChunksPlugin,可以通过配置 optimization.splitChunks 选项来自动分割代码。例如:
module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  }
};

chunks: 'all' 表示对所有类型的 chunk 进行分割,Webpack 会根据一些默认规则(如最小大小、最大并行请求数等)将公共模块提取到单独的 chunk 中。

Vite题库

单选题

1. Vite 是基于以下哪种技术实现的快速构建工具?

A. 传统打包工具(如 Webpack)
B. 原生 ES 模块
C. Node.js 全量编译
D. 浏览器端打包

答案:B

解析

  • Vite 是基于原生 ES 模块实现的快速构建工具。在开发环境下,Vite 利用浏览器对原生 ES 模块的支持,无需像传统打包工具(如 Webpack)那样对所有文件进行提前打包,而是直接在浏览器请求模块时进行处理,大大提高了开发服务器的启动速度和模块热更新的响应速度。
  • 选项 A 中传统打包工具需要全量打包,启动速度慢,不符合 Vite 的特点;
  • 选项 C,Vite 不是全量编译,而是按需编译;
  • 选项 D,Vite 并非浏览器端打包,它是在开发环境和生产环境都有特定处理方式的构建工具。

2. Vite 开发服务器启动时,以下哪种说法是正确的?

A. 会对所有代码进行打包处理
B. 只会对入口文件进行解析
C. 按需编译和提供模块
D. 仅处理 CSS 文件

答案:C

解析

  • Vite 在开发服务器启动时,采用按需编译和提供模块的方式。当浏览器请求某个模块时,Vite 才会对该模块进行编译并返回给浏览器,而不是像传统打包工具那样对所有代码进行提前打包处理,所以选项 A 错误。
  • 它不仅仅解析入口文件,而是根据浏览器的请求按需处理各个模块,选项 B 错误。
  • Vite 可以处理多种类型的文件,包括 JavaScript、CSS、图片等,并非仅处理 CSS 文件,选项 D 错误。

3. Vite 生产环境构建使用的是以下哪种工具?

A. Rollup
B. Webpack
C. Parcel
D. Browserify

答案:A

解析

  • Vite 在生产环境构建时使用 Rollup 进行打包。Rollup 是一个 JavaScript 模块打包工具,具有高效、简洁的特点,Vite 借助 Rollup 的能力将项目代码打包成适合生产环境部署的文件。
  • Webpack 是另一个流行的打包工具,但不是 Vite 生产环境默认使用的;
  • Parcel 也是一个零配置的打包工具,与 Vite 生产环境构建无关;
  • Browserify 主要用于在浏览器中使用 Node.js 模块的打包,同样不是 Vite 生产环境的选择。

多选题

1. 以下哪些是 Vite 的优点?

A. 快速冷启动
B. 即时热更新
C. 按需编译
D. 配置复杂

答案:ABC

解析

  • 选项 A:由于 Vite 基于原生 ES 模块,在开发环境下无需全量打包,因此可以实现快速冷启动,相比传统打包工具能节省大量的启动时间。
  • 选项 B:Vite 支持即时热更新,当代码发生变化时,能够快速更新页面,无需刷新整个页面,大大提高了开发效率。
  • 选项 C:Vite 采用按需编译的方式,只有当浏览器请求某个模块时才进行编译,减少了不必要的编译工作,提高了开发体验。
  • 选项 D:Vite 的配置相对简单,很多情况下可以使用默认配置,不需要像 Webpack 那样进行复杂的配置,所以该选项错误。

2. Vite 支持以下哪些文件类型的处理?

A. JavaScript
B. CSS
C. Vue 单文件组件
D. TypeScript

答案:ABCD

解析:Vite 具有良好的文件类型支持能力。

  • 选项 A:Vite 可以处理 JavaScript 文件,无论是普通的 JavaScript 代码还是使用了 ES 模块语法的代码。
  • 选项 B:对于 CSS 文件,Vite 可以直接处理,支持 CSS 模块、预处理器(如 Sass、Less 等)。
  • 选项 C:Vite 对 Vue 单文件组件(SFC)有很好的支持,提供了快速的开发体验和高效的构建能力。
  • 选项 D:Vite 也支持 TypeScript 文件,会自动对 TypeScript 代码进行编译和处理。

3. 在 Vite 中,以下哪些可以作为配置文件?

A. vite.config.js
B. vite.config.ts
C. vite.config.json
D. vite.config.yaml

答案:AB

解析:Vite 支持使用 JavaScript 或 TypeScript 编写配置文件,常见的配置文件名为 vite.config.js 或 vite.config.ts。虽然在理论上可以通过一些方式实现使用 JSON 或 YAML 格式的配置文件,但 Vite 官方推荐和默认支持的是 JavaScript 和 TypeScript 配置文件,所以选项 C 和 D 不符合要求。

简答题

1. 简述 Vite 开发环境和生产环境的工作原理有何不同?

答案

  • 开发环境

    • Vite 利用浏览器对原生 ES 模块的支持,启动一个轻量级的开发服务器。当服务器启动时,它不会对整个项目进行打包,而是直接启动服务。
    • 当浏览器请求某个模块时,Vite 会按需对该模块进行编译,将其转换为浏览器可以理解的格式并返回给浏览器。这种按需编译的方式避免了传统打包工具全量编译的性能开销,实现了快速的冷启动和即时热更新。
  • 生产环境

    • Vite 使用 Rollup 进行打包。它会对整个项目进行静态分析,将所有模块打包成一个或多个优化后的文件,以减少文件体积和请求次数。
    • 打包过程中会进行代码压缩、Tree - Shaking(去除未使用的代码)等优化操作,生成适合生产环境部署的文件。

2. 如何在 Vite 项目中配置别名(alias)?

答案
在 Vite 项目中配置别名可以通过 vite.config.js 或 vite.config.ts 文件来实现。以下是具体步骤和示例代码:

  • 创建或打开配置文件:如果项目根目录下没有 vite.config.js 或 vite.config.ts 文件,需要创建一个。
  • 配置别名:在配置文件中使用 resolve.alias 选项来定义别名。

以下是使用 JavaScript 配置文件的示例:

import { defineConfig } from 'vite';

export default defineConfig({
  resolve: {
    alias: {
      '@': '/src' // 将 @ 别名指向 src 目录
    }
  }
});

以下是使用 TypeScript 配置文件的示例:

import { defineConfig } from 'vite';

export default defineConfig({
  resolve: {
    alias: {
      '@': '/src'
    }
  }
});

配置完成后,在项目中就可以使用 @ 别名来引用 src 目录下的文件,例如 import SomeComponent from '@/components/SomeComponent.vue'

3. 请解释 Vite 中的 HMR(热模块替换)机制及其优势。

答案

  • HMR 机制

    • Vite 的 HMR 机制基于原生 ES 模块和 Vite 开发服务器。当代码发生变化时,Vite 会检测到文件的更改,并通过 WebSocket 与浏览器建立通信。
    • 服务器会将更改的模块信息发送给浏览器,浏览器根据这些信息,只更新发生变化的模块,而不是刷新整个页面。对于不同类型的模块,Vite 有不同的处理方式。例如,对于 CSS 模块,会直接更新 <style> 标签;对于 Vue 单文件组件,会更新组件的模板、样式或脚本部分。
  • 优势

    • 提高开发效率:由于只更新发生变化的模块,无需刷新整个页面,开发者可以在不丢失当前页面状态的情况下快速看到代码更改的效果,大大节省了开发时间。
    • 减少调试成本:在调试过程中,不会因为页面刷新而丢失之前的操作和调试信息,方便开发者定位和解决问题。
    • 改善开发体验:提供了更流畅的开发体验,让开发者能够专注于代码编写,而不是等待页面刷新。

GIT题库

单选题

1. 以下哪个命令用于将本地仓库的修改提交到暂存区?

A. git commit
B. git push
C. git add
D. git pull

答案:C

解析

  • 选项 Agit commit 命令用于将暂存区的内容提交到本地仓库,它会生成一个新的提交记录,而不是将本地修改添加到暂存区。
  • 选项 Bgit push 命令用于将本地仓库的提交推送到远程仓库,是将本地仓库的内容同步到远程仓库的操作。
  • 选项 Cgit add 命令可以将工作区的修改添加到暂存区,暂存区是一个中间区域,方便我们组织和管理要提交的内容,所以该选项正确。
  • 选项 Dgit pull 命令用于从远程仓库拉取最新的代码并合并到本地仓库,是更新本地仓库的操作。

2. 要查看当前仓库的状态,应该使用以下哪个命令?

A. git status
B. git log
C. git diff
D. git branch

答案:A

解析

  • 选项 Agit status 命令用于显示工作区、暂存区和本地仓库的状态,能让我们清楚地知道哪些文件被修改、哪些文件被添加到暂存区、哪些文件还未被跟踪等信息,所以该选项正确。
  • 选项 Bgit log 命令用于查看提交历史记录,展示了一系列的提交信息,如提交的哈希值、作者、日期和提交说明等,但不能查看当前仓库的状态。
  • 选项 Cgit diff 命令用于查看文件的差异,默认情况下是查看工作区和暂存区之间的差异,它不是用于查看仓库整体状态的命令。
  • 选项 Dgit branch 命令用于管理分支,如列出分支、创建分支、删除分支等,和查看仓库状态无关。

3. 以下哪个命令用于从远程仓库克隆一个项目到本地?

A. git clone
B. git fetch
C. git merge
D. git rebase

答案:A

解析

  • 选项 Agit clone 命令用于从远程仓库复制一个完整的项目到本地,它会创建一个新的本地仓库,并将远程仓库的所有文件和提交历史都下载到本地,所以该选项正确。
  • 选项 Bgit fetch 命令用于从远程仓库获取最新的提交信息,但不会自动合并到本地分支,只是更新本地的远程分支引用。
  • 选项 Cgit merge 命令用于将一个分支的修改合并到当前分支,是在本地仓库内部进行分支合并的操作。
  • 选项 Dgit rebase 也是用于整合来自不同分支的修改,但它是通过将一个分支的提交重新应用到另一个分支上来实现的,同样是本地仓库内的操作。

多选题

1. 以下哪些操作可以撤销本地的修改?

A. git checkout -- <file>
B. git reset HEAD <file>
C. git revert <commit>
D. git clean -f

答案:AD

解析

  • 选项 Agit checkout -- <file> 命令可以撤销工作区中指定文件的修改,将文件恢复到上次提交时的状态,所以该选项正确。
  • 选项 Bgit reset HEAD <file> 命令是将暂存区的指定文件撤回到工作区,而不是撤销本地的修改,只是改变了文件在暂存区的状态。
  • 选项 Cgit revert <commit> 命令用于创建一个新的提交来撤销指定提交的修改,它是针对已经提交到本地仓库的内容,而不是本地未提交的修改。
  • 选项 Dgit clean -f 命令用于删除工作区中未被跟踪的文件,对于不需要的新增文件可以使用该命令撤销,所以该选项正确。

2. 关于 Git 分支,以下说法正确的是?

A. git branch 可以列出所有分支
B. git checkout -b <branch> 可以创建并切换到新分支
C. 合并分支时可能会出现冲突
D. 分支可以提高团队协作效率

答案:ABCD

解析

  • 选项 Agit branch 命令在不添加任何参数的情况下,会列出本地仓库的所有分支,所以该选项正确。
  • 选项 Bgit checkout -b <branch> 是一个组合命令,它会创建一个新的分支,并立即切换到该分支,方便我们快速开始在新分支上进行开发,所以该选项正确。
  • 选项 C:当合并两个分支时,如果两个分支对同一文件的同一部分进行了不同的修改,就会出现冲突,需要手动解决冲突后才能完成合并,所以该选项正确。
  • 选项 D:分支允许团队成员在不同的分支上独立开发不同的功能或修复不同的问题,避免相互干扰,提高了团队协作的效率,所以该选项正确。

3. 以下哪些是 Git 的基本概念?

A. 工作区
B. 暂存区
C. 本地仓库
D. 远程仓库

答案:ABCD

解析

  • 工作区:是我们在本地计算机上实际进行文件编辑和修改的地方,也就是项目所在的目录。
  • 暂存区:也称为索引,是一个中间区域,用于组织和管理要提交到本地仓库的文件。通过 git add 命令将工作区的修改添加到暂存区。
  • 本地仓库:存储在本地计算机上的仓库,包含了项目的所有提交历史和分支信息。通过 git commit 命令将暂存区的内容提交到本地仓库。
  • 远程仓库:存储在远程服务器上的仓库,通常用于团队协作,多个开发者可以将本地仓库的提交推送到远程仓库,也可以从远程仓库拉取最新的代码。这四个都是 Git 的基本概念,所以全选。

简答题

1. 简述 Git 中工作区、暂存区和本地仓库的关系。

答案
工作区、暂存区和本地仓库是 Git 管理代码的三个重要区域,它们之间的关系如下:

  • 工作区是我们实际编辑和修改文件的地方,是项目在本地计算机上的可见目录。当我们对文件进行创建、修改或删除等操作时,这些更改首先发生在工作区。
  • 暂存区是一个中间区域,它可以理解为一个缓冲区,用于组织和管理要提交到本地仓库的文件。我们使用 git add 命令将工作区的修改添加到暂存区。暂存区允许我们选择性地将部分修改提交到本地仓库,而不是一次性提交所有修改。
  • 本地仓库是存储在本地计算机上的仓库,包含了项目的所有提交历史和分支信息。使用 git commit 命令将暂存区的内容提交到本地仓库,生成一个新的提交记录。

简单来说,工作区的修改通过 git add 进入暂存区,暂存区的内容通过 git commit 进入本地仓库。

2. 如何解决 Git 合并分支时出现的冲突?

答案
当 Git 合并分支时出现冲突,通常可以按照以下步骤解决:

  • 查看冲突文件:使用 git status 命令查看哪些文件发生了冲突。发生冲突的文件会在状态信息中显示为 “both modified” 或类似的提示。
  • 编辑冲突文件:打开冲突的文件,会看到类似以下的冲突标记:
<<<<<<< HEAD
// 当前分支的代码
=======
// 要合并的分支的代码
>>>>>>> branch-name

我们需要手动编辑这些冲突部分,选择保留哪些代码,删除不需要的代码和冲突标记。可以根据实际需求,保留当前分支的代码、合并分支的代码,或者将两者进行合并。

  • 标记冲突已解决:编辑完冲突文件后,使用 git add <file> 命令将解决冲突后的文件添加到暂存区,表示该文件的冲突已经解决。
  • 完成合并:使用 git commit 命令完成合并操作,生成一个新的提交记录,将解决冲突后的更改提交到本地仓库。

3. 解释 Git 中的 rebase 和 merge 命令的区别。

答案
git rebase 和 git merge 都用于将一个分支的修改整合到另一个分支,但它们的实现方式和效果有所不同:

  • 实现方式

    • git merge:是将两个分支的最新提交合并在一起,创建一个新的合并提交。它会保留两个分支的提交历史,形成一个分支合并的图形结构,新的提交记录会显示两个分支的合并点。
    • git rebase:是将一个分支的提交记录重新应用到另一个分支上,它会把当前分支的提交暂时保存,然后将当前分支更新到目标分支的最新状态,最后再将保存的提交依次应用到更新后的分支上。这样会使提交历史看起来更加线性。
  • 提交历史

    • git merge:会保留分支的原始提交历史,提交记录会呈现出分支和合并的复杂结构,适合保留每个分支的独立开发历史,方便查看不同分支的贡献。
    • git rebase:会使提交历史更加简洁和线性,避免了合并提交的产生,使提交历史看起来像一个连续的开发过程,适合追求简洁提交历史的项目。
  • 冲突处理

    • git merge:在合并过程中如果出现冲突,只需要解决一次冲突,然后创建一个合并提交即可。
    • git rebase:在变基过程中,如果出现冲突,需要依次解决每个提交的冲突,每次解决冲突后都需要使用 git rebase --continue 继续变基操作,可能会多次处理冲突。

Nginx题库

1. Nginx 主要用于以下哪种场景?

A. 数据库管理
B. 前端页面开发
C. 反向代理和负载均衡
D. 代码版本控制

答案:C

解析

  • 选项 A:数据库管理通常使用专门的数据库管理系统,如 MySQL、Oracle 等,Nginx 并不具备数据库管理的功能,所以 A 选项错误。
  • 选项 B:前端页面开发主要涉及 HTML、CSS、JavaScript 等技术,以及相关的前端框架和工具,Nginx 不是用于前端页面开发的工具,所以 B 选项错误。
  • 选项 C:Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,它可以作为反向代理服务器将客户端的请求转发到后端的应用服务器上,同时还能实现负载均衡,将请求均匀地分配到多个后端服务器上,提高系统的性能和可用性,所以 C 选项正确。
  • 选项 D:代码版本控制一般使用 Git 等工具,Nginx 与代码版本控制无关,所以 D 选项错误。

2. 以下哪个指令用于在 Nginx 配置文件中设置监听的端口?

A. server_name
B. listen
C. location
D. root

答案:B

解析

  • 选项 Aserver_name 指令用于指定服务器的名称,可以是域名或 IP 地址,用于匹配客户端请求的主机名,而不是设置监听端口,所以 A 选项错误。
  • 选项 Blisten 指令用于指定 Nginx 服务器监听的端口号或 IP 地址和端口号的组合。例如 listen 80; 表示监听 80 端口,所以 B 选项正确。
  • 选项 Clocation 指令用于匹配客户端请求的 URI,根据不同的 URI 进行不同的处理,如转发请求、返回静态文件等,与监听端口无关,所以 C 选项错误。
  • 选项 Droot 指令用于指定静态文件的根目录,当客户端请求静态文件时,Nginx 会从该目录下查找相应的文件,不是设置监听端口的指令,所以 D 选项错误。

3. 在 Nginx 配置文件中,location / 表示什么?

A. 匹配所有以 / 开头的请求
B. 匹配根目录下的所有文件
C. 只匹配根路径的请求
D. 匹配所有请求

答案:D

解析

  • 选项 A:虽然请求的 URI 通常以 / 开头,但 location / 的含义不仅仅是匹配以 / 开头的请求,它是一种更宽泛的匹配规则,所以 A 选项错误。
  • 选项 Blocation / 主要是对请求的 URI 进行匹配,而不是直接匹配根目录下的所有文件,所以 B 选项错误。
  • 选项 C:它不只是匹配根路径的请求,对于所有的请求都会尝试进行匹配,所以 C 选项错误。
  • 选项 Dlocation / 是一个通用的匹配规则,会匹配所有的请求。当没有其他更具体的 location 块匹配请求时,就会使用这个 location / 块进行处理,所以 D 选项正确。

多选题

1. 以下哪些是 Nginx 作为反向代理的优点?

A. 提高网站的安全性
B. 增强网站的性能
C. 实现负载均衡
D. 方便进行缓存管理

答案:ABCD

解析

  • 选项 A:Nginx 作为反向代理可以隐藏后端服务器的真实 IP 地址,防止后端服务器直接暴露在公网上,从而提高网站的安全性,避免恶意攻击直接针对后端服务器,所以 A 选项正确。
  • 选项 B:Nginx 可以对静态文件进行缓存,减少后端服务器的压力,同时它的高性能架构能够快速处理客户端的请求,提高网站的响应速度,增强网站的性能,所以 B 选项正确。
  • 选项 C:Nginx 可以根据不同的负载均衡算法(如轮询、IP 哈希等)将客户端的请求均匀地分配到多个后端服务器上,实现负载均衡,提高系统的可用性和处理能力,所以 C 选项正确。
  • 选项 D:Nginx 支持对静态文件和动态内容进行缓存管理。对于频繁访问的资源,Nginx 可以将其缓存起来,当有相同的请求时,直接从缓存中返回结果,减少后端服务器的处理负担,提高响应速度,所以 D 选项正确。

2. 在 Nginx 配置文件中,server 块可以用于哪些配置?

A. 监听端口
B. 域名配置
C. 错误页面设置
D. 日志记录配置

答案:ABCD

解析

  • 选项 A:在 server 块中可以使用 listen 指令来设置该虚拟服务器监听的端口号,所以 A 选项正确。
  • 选项 B:通过 server_name 指令可以在 server 块中配置域名,使得 Nginx 可以根据不同的域名进行不同的处理,实现虚拟主机的功能,所以 B 选项正确。
  • 选项 C:使用 error_page 指令可以在 server 块中设置不同 HTTP 状态码对应的错误页面,当出现相应的错误时,Nginx 会返回指定的错误页面,所以 C 选项正确。
  • 选项 D:可以在 server 块中使用 access_log 和 error_log 指令来配置访问日志和错误日志的记录位置和格式,方便对服务器的运行情况进行监控和分析,所以 D 选项正确。

3. 以下哪些是 Nginx 常用的负载均衡算法?

A. 轮询
B. IP 哈希
C. 加权轮询
D. 最少连接

答案:ABCD

解析

  • 选项 A:轮询是最基本的负载均衡算法,Nginx 会按照顺序依次将请求分配到后端服务器列表中的每个服务器上,每个服务器接收的请求数量大致相同,所以 A 选项正确。
  • 选项 B:IP 哈希算法根据客户端的 IP 地址进行哈希计算,将相同 IP 地址的客户端请求始终分配到同一台后端服务器上,这样可以保证同一客户端的请求总是由同一台服务器处理,适合对会话保持有要求的场景,所以 B 选项正确。
  • 选项 C:加权轮询是在轮询算法的基础上,为每个后端服务器分配一个权重值。权重值越高的服务器,接收的请求数量就越多,这样可以根据服务器的性能和处理能力来合理分配请求,所以 C 选项正确。
  • 选项 D:最少连接算法会将新的请求分配给当前连接数最少的后端服务器,这样可以确保每个服务器的负载相对均衡,充分利用服务器的资源,所以 D 选项正确。

简答题

1. 简述 Nginx 的工作原理。

答案
Nginx 采用事件驱动的异步非阻塞 I/O 模型,其工作原理主要包括以下几个方面:

  • 启动阶段:Nginx 启动时会读取配置文件,根据配置文件中的设置创建主进程(master process)和多个工作进程(worker process)。主进程负责管理工作进程,如加载配置、监控工作进程状态等;工作进程负责处理客户端的请求。
  • 接收请求:当有客户端请求到达时,Nginx 的工作进程会通过监听指定的端口接收请求。工作进程采用异步非阻塞的方式处理多个请求,不会因为某个请求的处理而阻塞其他请求的接收和处理。
  • 请求处理:工作进程接收到请求后,会根据配置文件中的规则对请求进行处理。例如,对于静态文件请求,工作进程会直接从文件系统中读取文件并返回给客户端;对于动态请求,工作进程会将请求转发到后端的应用服务器上进行处理。
  • 反向代理和负载均衡:如果配置了反向代理和负载均衡,Nginx 会根据负载均衡算法(如轮询、IP 哈希等)将请求转发到后端的多个服务器上,以实现请求的分发和负载均衡。
  • 响应客户端:工作进程处理完请求后,会将响应结果返回给客户端。如果是从后端服务器获取的响应,工作进程会将其转发给客户端。

2. 如何在 Nginx 中配置反向代理?

答案
在 Nginx 中配置反向代理通常需要以下步骤:

  • 编辑 Nginx 配置文件:一般 Nginx 的主配置文件位于 /etc/nginx/nginx.conf,也可以在 /etc/nginx/conf.d/ 目录下创建新的配置文件。打开配置文件后,在 server 块中添加反向代理的配置。
  • 配置反向代理规则:使用 location 块来匹配客户端请求的 URI,并使用 proxy_pass 指令指定后端服务器的地址。示例配置如下:
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        # 可以添加其他代理相关的配置
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

在上述配置中,listen 80 表示监听 80 端口,server_name example.com 表示该虚拟服务器的域名是 example.comlocation / 匹配所有请求,proxy_pass http://backend_server 表示将请求转发到 http://backend_server 这个后端服务器上。proxy_set_header 指令用于设置转发请求时的 HTTP 头信息。

  • 重启 Nginx 服务:配置完成后,保存配置文件并重启 Nginx 服务,使配置生效。可以使用以下命令重启 Nginx:
sudo systemctl restart nginx

3. 解释 Nginx 中 location 块的作用和匹配规则。

答案

  • 作用location 块在 Nginx 配置文件中用于对客户端请求的 URI 进行匹配和处理。通过 location 块,可以根据不同的 URI 模式来执行不同的操作,如转发请求到后端服务器、返回静态文件、设置缓存策略等。它可以实现对不同类型请求的精细化管理,提高服务器的灵活性和性能。

  • 匹配规则

    • 前缀匹配:以 / 开头的 location 块是前缀匹配规则,Nginx 会根据请求的 URI 前缀来查找匹配的 location 块。例如,location /images/ 会匹配所有以 /images/ 开头的请求。如果有多个前缀匹配的 location 块,Nginx 会选择最长匹配的 location 块进行处理。
    • 精确匹配:使用 = 符号开头的 location 块是精确匹配规则,只有当请求的 URI 与 location 块中指定的 URI 完全相同时才会匹配。例如,location = /index.html 只匹配请求 /index.html 的情况。
    • 正则匹配:使用 ~ 或 ~* 开头的 location 块是正则匹配规则,~ 表示区分大小写的正则匹配,~* 表示不区分大小写的正则匹配。例如,location ~ .(jpg|png|gif)$ 会匹配所有以 .jpg.png 或 .gif 结尾的请求。正则匹配的优先级高于前缀匹配,当有正则匹配和前缀匹配都满足时,Nginx 会优先使用正则匹配的 location 块进行处理。

Node题库

单选题

1. Node.js 是基于以下哪种技术构建的?

A. Java
B. Python
C. Chrome V8 引擎
D. Ruby

答案:C

解析:Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行环境。V8 引擎是 Google 开发的高性能 JavaScript 引擎,它将 JavaScript 代码编译成机器码执行,大大提高了 JavaScript 的执行速度。而 Java、Python、Ruby 与 Node.js 的构建基础无关,所以选项 C 正确。

2. 在 Node.js 中,以下哪个模块用于创建 HTTP 服务器?

A. fs
B. http
C. path
D. url

答案:B

解析

  • 选项 Afs 模块是 Node.js 的文件系统模块,用于对文件进行读写、创建、删除等操作,并非用于创建 HTTP 服务器。
  • 选项 Bhttp 模块是 Node.js 内置的用于创建 HTTP 服务器和客户端的模块。通过该模块可以轻松地创建一个 HTTP 服务器,监听指定端口并处理客户端的请求,所以该选项正确。
  • 选项 Cpath 模块主要用于处理和转换文件路径,提供了一些实用的方法来处理文件路径的拼接、解析等操作,和创建 HTTP 服务器没有直接关系。
  • 选项 Durl 模块用于处理和解析 URL,可对 URL 进行拆分、组合等操作,不是用于创建 HTTP 服务器的模块。

3. 以下哪种方式可以在 Node.js 中实现异步操作?

A. 使用回调函数
B. 仅使用同步函数
C. 不使用任何函数
D. 只使用 setTimeout

答案:A

解析

  • 选项 A:在 Node.js 中,使用回调函数是实现异步操作的常见方式之一。许多 Node.js 的 API 都是基于回调函数的,例如文件读取、网络请求等操作。当进行异步操作时,函数会立即返回,不会阻塞后续代码的执行,当操作完成后会调用回调函数来处理结果,所以该选项正确。
  • 选项 B:同步函数会阻塞代码的执行,直到操作完成才会继续执行后续代码,无法实现异步操作,所以该选项错误。
  • 选项 C:不使用任何函数无法完成具体的操作,更无法实现异步操作,所以该选项错误。
  • 选项 DsetTimeout 是实现异步操作的一种方式,但不是唯一的方式,除了 setTimeout,还有回调函数、Promise、async/await 等多种方式可以实现异步操作,所以该选项错误。

多选题

1. 以下哪些是 Node.js 的特点?

A. 单线程
B. 非阻塞 I/O
C. 事件驱动
D. 适合 CPU 密集型任务

答案:ABC

解析

  • 选项 A:Node.js 采用单线程模型,主线程负责处理所有的事件循环,但它可以通过子进程、工作线程等方式实现并发处理,所以该选项正确。
  • 选项 B:非阻塞 I/O 是 Node.js 的核心特点之一。当进行 I/O 操作(如文件读写、网络请求)时,Node.js 不会阻塞线程,而是继续执行后续代码,当 I/O 操作完成后会通过回调函数通知主线程,从而提高了系统的性能和响应能力,所以该选项正确。
  • 选项 C:Node.js 是事件驱动的,它通过事件循环机制来处理各种事件。当某个事件发生时,会触发相应的回调函数进行处理,例如 HTTP 请求的到来、文件读取完成等事件,所以该选项正确。
  • 选项 D:Node.js 由于其单线程的特性,不适合处理 CPU 密集型任务。在处理 CPU 密集型任务时,会阻塞主线程,导致其他请求无法及时处理,影响系统的性能,更适合处理 I/O 密集型任务,所以该选项错误。

2. 在 Node.js 中,以下哪些模块可以用于文件操作?

A. fs
B. path
C. os
D. child_process

答案:AB

解析

  • 选项 Afs 模块是 Node.js 专门用于文件系统操作的模块,提供了一系列的方法来进行文件的读写、创建、删除、重命名等操作,所以该选项正确。
  • 选项 Bpath 模块虽然不直接进行文件的读写等操作,但它可以用于处理和转换文件路径,在文件操作中经常会用到,例如拼接文件路径、获取文件扩展名等,所以该选项正确。
  • 选项 Cos 模块用于获取操作系统的相关信息,如 CPU 信息、内存信息、操作系统类型等,与文件操作无关,所以该选项错误。
  • 选项 Dchild_process 模块用于创建子进程,执行外部命令等操作,主要用于实现进程间的通信和并发处理,并非用于文件操作,所以该选项错误。

3. 以下哪些是 Node.js 中的包管理工具?

A. npm
B. yarn
C. pip
D. gem

答案:AB

解析

  • 选项 A:npm(Node Package Manager)是 Node.js 的官方包管理工具,它允许开发者方便地安装、更新、删除和管理项目中的依赖包,是 Node.js 生态系统中最常用的包管理工具,所以该选项正确。
  • 选项 B:yarn 是 Facebook 开发的另一个流行的 Node.js 包管理工具,它在性能和安全性方面有一些改进,与 npm 功能类似,也可以用于管理 Node.js 项目的依赖包,所以该选项正确。
  • 选项 C:pip 是 Python 的包管理工具,用于安装和管理 Python 包,与 Node.js 无关,所以该选项错误。
  • 选项 D:gem 是 Ruby 的包管理工具,用于管理 Ruby 的 gem 包,和 Node.js 没有关系,所以该选项错误。

简答题

1. 简述 Node.js 事件循环(Event Loop)的工作原理。

答案
Node.js 的事件循环是其实现异步非阻塞 I/O 的核心机制,其工作原理如下:

  • 事件循环的启动:当 Node.js 程序启动时,会初始化事件循环,同时创建一个任务队列。

  • 异步操作的触发:当程序中发起一个异步操作(如文件读取、网络请求)时,Node.js 会将该操作交给底层的操作系统或线程池处理,而不会阻塞主线程。同时,会为该操作注册一个回调函数。

  • 事件循环的阶段:事件循环主要分为几个阶段,包括定时器(Timers)、I/O 回调(I/O callbacks)、空闲 / 预备(Idle, prepare)、轮询(Poll)、检查(Check)、关闭回调(Close callbacks)。

    • 定时器阶段:处理 setTimeout 和 setInterval 的回调函数。
    • I/O 回调阶段:处理上一轮循环中未完成的 I/O 回调。
    • 轮询阶段:这是事件循环的核心阶段,会检查是否有新的 I/O 事件到来。如果有,会执行相应的回调函数;如果没有,会根据定时器的时间设置,决定是等待还是进入下一个阶段。
    • 检查阶段:处理 setImmediate 的回调函数。
    • 关闭回调阶段:处理关闭事件的回调函数,如 socket.on('close', callback)
  • 回调函数的执行:当异步操作完成后,其对应的回调函数会被放入任务队列中。事件循环会不断地从任务队列中取出回调函数并执行,直到任务队列为空。

2. 如何在 Node.js 中创建一个简单的 HTTP 服务器?

答案
在 Node.js 中,可以使用 http 模块创建一个简单的 HTTP 服务器,以下是具体步骤和示例代码:

  • 引入 http 模块:在 Node.js 代码中,首先需要引入 http 模块。
  • 创建服务器实例:使用 http.createServer() 方法创建一个 HTTP 服务器实例,并传入一个回调函数,该回调函数会在每次有客户端请求时被调用。
  • 监听端口:使用服务器实例的 listen() 方法监听指定的端口,当有请求到达该端口时,服务器会进行处理。

示例代码如下:

const http = require('http');

// 创建服务器实例
const server = http.createServer((req, res) => {
    // 设置响应头
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    // 发送响应内容
    res.end('Hello, World!\n');
});

// 监听 3000 端口
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在上述代码中,http.createServer() 方法创建了一个服务器实例,回调函数接收 req(请求对象)和 res(响应对象)作为参数。在回调函数中,使用 res.writeHead() 方法设置响应头,使用 res.end() 方法发送响应内容。最后,使用 server.listen() 方法监听 3000 端口。

3. 解释 Node.js 中的模块系统,以及 require 和 exports 的作用。

答案

  • 模块系统:Node.js 采用了 CommonJS 模块规范,将代码分割成多个独立的模块,每个模块都有自己的作用域,避免了全局变量的污染。模块可以是一个 JavaScript 文件,也可以是一个包含 package.json 文件的目录。通过模块系统,开发者可以将代码进行模块化组织,提高代码的可维护性和复用性。
  • require 的作用require 是 Node.js 中用于引入模块的函数。当调用 require() 函数并传入模块的路径时,Node.js 会根据路径查找对应的模块文件,并将该模块的导出内容返回。如果是内置模块(如 httpfs 等),可以直接使用模块名引入;如果是自定义模块,需要使用相对路径或绝对路径引入。例如:
// 引入内置模块
const http = require('http');
// 引入自定义模块
const myModule = require('./myModule');
  • exports 的作用exports 是每个模块内部的一个对象,用于导出模块的公共接口。在模块内部,可以通过给 exports 对象添加属性或方法,将这些属性和方法暴露给外部模块使用。例如:
// myModule.js
exports.sayHello = function() {
    return 'Hello!';
};

在其他模块中引入 myModule 后,就可以使用 sayHello 方法:

const myModule = require('./myModule');
console.log(myModule.sayHello()); // 输出: Hello!

Linux题库

单选题

1. 以下哪个命令用于显示当前工作目录?

A. ls
B. cd
C. pwd
D. mkdir

答案:C

解析

  • 选项 Als 命令用于列出目录内容,显示当前目录下的文件和子目录信息,并非显示当前工作目录,所以 A 选项错误。
  • 选项 Bcd 命令用于切换当前工作目录,例如 cd /home/user 可以将当前工作目录切换到 /home/user,它不是用来显示当前工作目录的,所以 B 选项错误。
  • 选项 Cpwd 是 “print working directory” 的缩写,该命令会输出当前所在的工作目录的完整路径,所以 C 选项正确。
  • 选项 Dmkdir 命令用于创建新的目录,如 mkdir new_folder 会在当前目录下创建一个名为 new_folder 的新目录,和显示当前工作目录无关,所以 D 选项错误。

2. 在 Linux 中,文件权限 rwxr-xr-- 表示的含义是?

A. 文件所有者具有读、写、执行权限,同组用户具有读、执行权限,其他用户具有读权限
B. 文件所有者具有读、写权限,同组用户具有读、执行权限,其他用户具有读权限
C. 文件所有者具有读、执行权限,同组用户具有读、写、执行权限,其他用户具有读权限
D. 文件所有者具有读、写、执行权限,同组用户具有读、写权限,其他用户具有读权限

答案:A

解析
Linux 文件权限由 10 个字符表示,第一个字符表示文件类型(如 - 表示普通文件,d 表示目录),后面 9 个字符每 3 个一组,分别代表文件所有者(user)、同组用户(group)和其他用户(others)的权限。

  • 权限字符 r 表示读权限,w 表示写权限,x 表示执行权限。
  • rwxr - xr -- 中,第一组 rwx 表示文件所有者具有读(r)、写(w)、执行(x)权限;第二组 r - x 表示同组用户具有读(r)和执行(x)权限;第三组 r -- 表示其他用户具有读(r)权限。所以 A 选项正确。

3. 以下哪个命令用于查看系统进程信息?

A. ps
B. top
C. kill
D. df

答案:A

解析

  • 选项 Aps 命令用于报告当前系统的进程状态,它可以显示当前运行的进程的相关信息,如进程 ID(PID)、用户、CPU 占用率、内存占用率等。例如 ps -ef 可以显示所有进程的详细信息,所以 A 选项正确。
  • 选项 Btop 命令也是用于查看系统进程信息,但它是一个动态的实时监控工具,会持续更新显示系统中各个进程的资源使用情况,而不是像 ps 那样只显示某一时刻的进程信息,所以 B 选项不太符合题意。
  • 选项 Ckill 命令用于向指定的进程发送信号,通常用于终止进程。例如 kill 1234 会向进程 ID 为 1234 的进程发送默认的终止信号,它不是用于查看进程信息的,所以 C 选项错误。
  • 选项 Ddf 命令用于显示文件系统的磁盘使用情况,包括磁盘的总容量、已使用容量、可用容量等信息,和查看系统进程信息无关,所以 D 选项错误。

多选题

1. 以下哪些是 Linux 系统中的常用文本编辑器?

A. vi
B. vim
C. nano
D. gedit

答案:ABCD

解析

  • 选项 Avi 是 Linux 系统中最经典的文本编辑器之一,它是一个基于字符界面的编辑器,功能强大,许多 Linux 系统默认安装了 vi 编辑器,所以 A 选项正确。
  • 选项 Bvim 是 vi 的增强版,在 vi 的基础上增加了很多新功能,如语法高亮、代码折叠等,它的使用非常广泛,是很多 Linux 用户喜欢的文本编辑器,所以 B 选项正确。
  • 选项 Cnano 是一个简单易用的文本编辑器,它具有直观的界面和简单的操作方式,适合初学者使用,许多 Linux 发行版都默认安装了 nano,所以 C 选项正确。
  • 选项 Dgedit 是一个图形化的文本编辑器,通常在基于 GNOME 桌面环境的 Linux 系统中使用,它提供了类似于 Windows 记事本的操作界面,方便用户进行文本编辑,所以 D 选项正确。

2. 在 Linux 中,以下哪些命令可以用于文件复制?

A. cp
B. mv
C. scp
D. rsync

答案:ACD

解析

  • 选项 Acp 是最常用的文件复制命令,用于在本地文件系统中复制文件或目录。例如 cp file1.txt file2.txt 会将 file1.txt 复制为 file2.txt,所以 A 选项正确。
  • 选项 Bmv 命令用于移动文件或目录,也可以用于重命名文件或目录,但它不是专门的文件复制命令,执行 mv 操作后,原文件或目录会被移动到新的位置,而不是复制一份,所以 B 选项错误。
  • 选项 Cscp 是用于在不同主机之间进行文件复制的命令,它基于 SSH 协议,保证了数据传输的安全性。例如 scp user@remote_host:/path/to/file /local/path 可以将远程主机上的文件复制到本地,所以 C 选项正确。
  • 选项 Drsync 是一个强大的文件同步和复制工具,它可以在本地或不同主机之间复制文件和目录,并且可以只复制有变化的部分,提高了复制效率,所以 D 选项正确。

3. 以下哪些是 Linux 系统中的常见用户组?

A. root
B. users
C. wheel
D. adm

答案:ABCD

解析

  • 选项 Aroot 是 Linux 系统中的超级用户组,拥有最高的系统权限,可以执行任何系统操作。root 用户组通常用于系统管理和维护,所以 A 选项正确。
  • 选项 Busers 是一个普通用户组,新创建的用户通常会被添加到这个组中,用于组织和管理普通用户,所以 B 选项正确。
  • 选项 Cwheel 组在许多 Linux 发行版中具有特殊的意义,通常只有 wheel 组的用户才能使用 sudo 命令以 root 权限执行操作,它是一个用于系统管理的重要用户组,所以 C 选项正确。
  • 选项 Dadm 组通常用于系统日志管理,属于该组的用户可以访问和管理系统的日志文件,所以 D 选项正确。

简答题

1. 简述 Linux 文件系统的目录结构及其主要目录的作用。

答案
Linux 文件系统采用树形目录结构,根目录用 / 表示,下面包含多个主要目录,各有其特定的作用:

  • /bin:存放系统必备的可执行文件,这些文件是系统启动和基本操作所必需的,所有用户都可以使用,例如 lscp 等命令。
  • /sbin:主要存放系统管理员使用的可执行文件,通常这些文件涉及系统的管理和维护操作,普通用户一般没有执行权限,如 ifconfigshutdown 等。
  • /etc:存储系统和应用程序的配置文件,例如网络配置、用户账户配置等,系统和应用程序启动时会读取这些配置文件。
  • /home:是普通用户的主目录所在的位置,每个用户都有自己的主目录,如 /home/user1/home/user2 等,用户可以在自己的主目录下存储个人文件和数据。
  • /root:是超级用户 root 的主目录,root 用户对系统具有最高的控制权限。
  • /var:用于存储经常变化的数据,如日志文件、邮件队列、缓存文件等。例如系统日志文件通常存放在 /var/log 目录下。
  • /tmp:是临时文件目录,系统和应用程序可以在这个目录下创建临时文件,这些文件在系统重启或定期清理时可能会被删除。
  • /usr:包含了用户相关的应用程序和文件,如用户级别的可执行文件、库文件、文档等。它是一个非常大的目录,类似于 Windows 系统中的 Program Files 目录。

2. 如何在 Linux 中创建一个新用户并设置密码?

答案
在 Linux 中,可以使用 useradd 命令创建新用户,使用 passwd 命令为用户设置密码,具体步骤如下:

  • 创建新用户:使用 useradd 命令创建新用户,例如创建一个名为 newuser 的用户:
sudo useradd newuser

使用 sudo 是因为创建用户需要管理员权限。

  • 设置用户密码:使用 passwd 命令为新用户设置密码,执行以下命令后,系统会提示输入新密码并确认:
sudo passwd newuser

按照提示输入新密码和确认密码,输入密码时屏幕上不会显示输入的内容,输入完成后按回车键即可完成密码设置。

另外,如果希望在创建用户的同时创建用户的主目录,可以使用 -m 选项,命令如下:

sudo useradd -m newuser

3. 解释 Linux 中的管道(|)和重定向(>>><)的作用。

答案

  • 管道(| :管道是 Linux 中一种非常有用的机制,它用于将一个命令的输出作为另一个命令的输入。通过管道符号 | 可以将多个命令连接起来,形成一个命令链,让数据在不同的命令之间流动。例如,ls -l | grep ".txt" 命令中,ls -l 命令用于列出当前目录下的文件详细信息,其输出会作为 grep ".txt" 命令的输入,grep 命令会在这些输出中查找包含 .txt 的行,最终只输出符合条件的行。这样可以方便地对命令的输出进行进一步的处理和筛选。

  • 重定向(>>><

    • > :称为输出重定向符号,用于将命令的输出结果覆盖写入到指定的文件中。如果文件不存在,会创建该文件;如果文件已经存在,会清空文件内容并将新的输出写入。例如,ls > file_list.txt 会将 ls 命令的输出结果覆盖写入到 file_list.txt 文件中。
    • >> :是追加输出重定向符号,它也用于将命令的输出结果写入到指定的文件中,但与 > 不同的是,它不会清空文件原有的内容,而是将新的输出追加到文件的末尾。例如,echo "Hello" >> message.txt 会将字符串 "Hello" 追加到 message.txt 文件的末尾。
    • < :是输入重定向符号,用于将文件的内容作为命令的输入。例如,sort < numbers.txt 会将 numbers.txt 文件中的内容作为 sort 命令的输入,对文件中的内容进行排序。

IIS题库

单选题

1. IIS 是以下哪个操作系统中的 Web 服务器软件?

A. Linux
B. macOS
C. Windows
D. Unix

答案:C

解析:IIS(Internet Information Services)是微软公司提供的 Web 服务器软件,它集成在 Windows 操作系统中,为 Windows 平台提供了强大的 Web 服务功能。Linux 系统中常用的 Web 服务器软件有 Apache、Nginx 等;macOS 通常使用 Apache 作为默认的 Web 服务器;Unix 系统也有多种适合的 Web 服务器,但 IIS 是专门为 Windows 设计的,所以答案选 C。

2. 在 IIS 中,以下哪个选项用于配置网站的绑定信息?

A. 应用程序池
B. 网站属性中的 “绑定” 设置
C. 虚拟目录
D. 处理程序映射

答案:B

解析

  • 选项 A:应用程序池是 IIS 中用于管理和隔离应用程序的一种机制,它主要负责管理工作进程的生命周期、资源分配等,与网站的绑定信息无关,所以 A 选项错误。
  • 选项 B:在 IIS 中,网站属性的 “绑定” 设置用于指定网站监听的 IP 地址、端口号以及主机名等信息,通过这些绑定信息,客户端可以准确地访问到相应的网站,所以 B 选项正确。
  • 选项 C:虚拟目录是将物理目录映射到网站的一个逻辑路径,方便用户访问网站中的不同目录结构,但它不用于配置网站的绑定信息,所以 C 选项错误。
  • 选项 D:处理程序映射用于指定不同类型的文件请求应该由哪个处理程序来处理,例如 ASPX 文件由 ASP.NET 处理程序处理,和网站的绑定信息没有关系,所以 D 选项错误。

3. 当 IIS 网站出现 404 错误时,通常表示?

A. 服务器内部错误
B. 未找到请求的资源
C. 禁止访问
D. 客户端请求有语法错误

答案:B

解析

  • 选项 A:服务器内部错误通常对应的 HTTP 状态码是 500,它表示服务器在处理请求时遇到了内部错误,无法完成请求,所以 A 选项错误。
  • 选项 B:HTTP 状态码 404 表示未找到请求的资源,当客户端请求的文件、页面或其他资源在服务器上不存在时,IIS 会返回 404 错误,所以 B 选项正确。
  • 选项 C:禁止访问对应的 HTTP 状态码是 403,它表示客户端有访问权限,但服务器拒绝了该请求,可能是由于权限设置等原因,所以 C 选项错误。
  • 选项 D:客户端请求有语法错误对应的 HTTP 状态码是 400,它表示客户端发送的请求存在语法错误,服务器无法理解该请求,所以 D 选项错误。

多选题

1. 以下哪些是 IIS 支持的功能?

A. 静态文件服务
B. ASP.NET 应用程序托管
C. 负载均衡
D. 安全认证

答案:ABCD

解析

  • 选项 A:IIS 可以作为静态文件服务器,为客户端提供 HTML、CSS、JavaScript、图片等静态文件的服务。当客户端请求这些静态文件时,IIS 会直接从文件系统中读取并返回给客户端,所以 A 选项正确。
  • 选项 B:IIS 对 ASP.NET 应用程序提供了很好的支持,它可以托管和运行各种类型的 ASP.NET 应用程序,包括 Web 表单、MVC 应用程序等,通过集成 ASP.NET 运行时,IIS 能够处理 ASP.NET 页面的请求和响应,所以 B 选项正确。
  • 选项 C:IIS 可以通过网络负载平衡(NLB)功能实现负载均衡,将客户端的请求均匀地分配到多个服务器上,提高网站的可用性和性能,所以 C 选项正确。
  • 选项 D:IIS 提供了多种安全认证方式,如基本认证、Windows 集成认证、表单认证等,通过这些认证方式可以对访问网站的用户进行身份验证,确保只有授权用户可以访问网站资源,所以 D 选项正确。

2. 在 IIS 中,应用程序池的作用包括?

A. 隔离应用程序
B. 管理工作进程
C. 提高性能
D. 配置网站绑定

答案:ABC

解析

  • 选项 A:应用程序池可以将不同的应用程序隔离开来,一个应用程序池中的应用程序出现问题不会影响其他应用程序池中的应用程序,提高了应用程序的稳定性和安全性,所以 A 选项正确。
  • 选项 B:应用程序池负责管理工作进程的生命周期,包括创建、启动、监控和回收工作进程。它可以根据配置的规则自动回收工作进程,以防止内存泄漏等问题,所以 B 选项正确。
  • 选项 C:通过合理配置应用程序池,可以优化资源分配,提高应用程序的性能。例如,可以为不同的应用程序池分配不同的内存和 CPU 资源,确保关键应用程序能够获得足够的资源,所以 C 选项正确。
  • 选项 D:网站绑定是在网站属性的 “绑定” 设置中进行配置的,与应用程序池无关,所以 D 选项错误。

3. 以下哪些方法可以在 IIS 中部署 Web 应用程序?

A. 复制文件到网站目录
B. 使用 Web Deploy 工具
C. 使用 FTP 上传文件
D. 通过 Visual Studio 发布

答案:ABCD

解析

  • 选项 A:可以将 Web 应用程序的文件直接复制到 IIS 网站对应的物理目录下,IIS 会自动识别并提供相应的服务,这是一种简单直接的部署方式,所以 A 选项正确。
  • 选项 B:Web Deploy 是微软提供的一个强大的 Web 应用程序部署工具,它可以实现增量部署、远程部署等功能,能够方便地将 Web 应用程序部署到 IIS 服务器上,所以 B 选项正确。
  • 选项 C:通过 FTP 客户端将 Web 应用程序的文件上传到 IIS 网站的物理目录,也是一种常见的部署方式。上传完成后,IIS 就可以提供相应的服务,所以 C 选项正确。
  • 选项 D:在 Visual Studio 中,可以使用发布功能将 Web 应用程序发布到 IIS 服务器。Visual Studio 会自动处理项目的打包、配置等工作,将应用程序部署到指定的 IIS 网站上,所以 D 选项正确。

简答题

1. 简述 IIS 的工作原理。

答案
IIS 的工作原理主要涉及以下几个方面:

  • 客户端请求:当客户端(如浏览器)向 IIS 服务器发送 HTTP 请求时,请求会通过网络传输到 IIS 服务器监听的端口(通常是 80 或 443)。

  • 请求处理

    • 协议解析:IIS 接收到请求后,首先对 HTTP 请求进行解析,提取请求的方法(如 GET、POST)、请求的 URI、请求头信息等。
    • 映射处理程序:根据请求的文件类型和配置的处理程序映射,IIS 确定应该由哪个处理程序来处理该请求。例如,对于静态文件请求,IIS 会直接从文件系统中读取文件并返回给客户端;对于动态请求(如 ASPX 文件),IIS 会将请求转发给相应的应用程序处理程序(如 ASP.NET 运行时)。
    • 应用程序池管理:IIS 使用应用程序池来管理和隔离应用程序。每个应用程序可以运行在一个独立的应用程序池中,应用程序池负责管理工作进程的生命周期和资源分配。当接收到请求时,IIS 会将请求分配给相应应用程序池中的工作进程进行处理。
  • 响应生成:处理程序接收到请求后,会根据请求的内容生成相应的响应。对于静态文件,直接读取文件内容;对于动态请求,处理程序会执行相应的代码逻辑,生成动态内容。

  • 响应返回:生成响应后,IIS 将响应内容封装成 HTTP 响应消息,包括响应状态码、响应头和响应体,然后通过网络将响应返回给客户端。

2. 如何在 IIS 中创建一个新的网站?

答案
在 IIS 中创建一个新的网站可以按照以下步骤进行:

  • 打开 IIS 管理器:在 Windows 操作系统中,通过 “开始” 菜单找到 “Internet Information Services (IIS) 管理器” 并打开。

  • 创建网站:在 IIS 管理器中,右键单击 “网站” 节点,选择 “添加网站”。

  • 配置网站信息

    • 网站名称:为新网站指定一个名称,用于在 IIS 管理器中标识该网站。
    • 物理路径:指定网站文件所在的物理目录,可以是本地磁盘上的一个文件夹。
    • 绑定信息:设置网站的绑定信息,包括 IP 地址、端口号和主机名。如果使用默认的 IP 地址和端口号(如 80),可以直接使用默认设置;如果需要使用特定的 IP 地址或端口号,需要进行相应的配置。如果要支持多个域名,可以配置主机名。
  • 测试网站:配置完成后,点击 “确定” 保存设置。可以在浏览器中输入网站的访问地址(如 http://localhost 或指定的域名)来测试网站是否能够正常访问。如果网站文件已经放置在指定的物理目录中,并且配置正确,浏览器应该能够显示网站的内容。

3. 解释 IIS 中应用程序池的回收机制及其作用。

答案

  • 回收机制

    • 定期回收:可以设置应用程序池在固定的时间间隔后进行回收。例如,设置每天凌晨 2 点回收应用程序池,IIS 会在指定时间自动关闭当前的工作进程,并创建一个新的工作进程来处理后续的请求。
    • 内存回收:当应用程序池中的工作进程使用的内存达到一定阈值时,IIS 会触发回收操作。可以配置内存使用的上限,当工作进程的内存使用超过该上限时,IIS 会关闭该工作进程并创建新的工作进程。
    • 请求数回收:可以设置应用程序池在处理一定数量的请求后进行回收。当工作进程处理的请求数达到指定的数量时,IIS 会回收该工作进程并创建新的工作进程。
  • 作用

    • 防止内存泄漏:随着应用程序的运行,可能会出现内存泄漏的问题,即应用程序不断占用内存而不释放。通过定期或基于内存使用情况的回收机制,可以及时关闭存在内存泄漏问题的工作进程,避免内存使用不断增长,保证服务器的稳定运行。
    • 释放资源:应用程序在运行过程中会占用各种系统资源,如内存、CPU 等。通过回收机制,可以释放这些资源,使服务器能够更高效地处理后续的请求。
    • 更新配置:当应用程序的配置文件发生更改时,通过回收应用程序池可以使新的配置生效。新的工作进程会加载最新的配置信息,确保应用程序按照新的配置运行。

前端安全漏洞题库

单选题

1. 以下哪种攻击方式属于 XSS(跨站脚本攻击)?

A. 攻击者通过修改 URL 参数来获取敏感信息
B. 攻击者在网页中注入恶意脚本,当用户访问该页面时执行脚本
C. 攻击者利用服务器的漏洞进行 SQL 注入
D. 攻击者通过暴力破解用户的密码

答案:B

解析

  • 选项 A:通过修改 URL 参数来获取敏感信息,这可能涉及到参数篡改等攻击,但不属于 XSS 攻击。例如在一些存在漏洞的系统中,修改 URL 中的 ID 参数来获取其他用户的数据,这更倾向于参数篡改漏洞利用,所以 A 选项错误。
  • 选项 B:XSS 攻击的核心就是攻击者将恶意脚本注入到网页中,当其他用户访问包含该恶意脚本的页面时,脚本会在用户的浏览器中执行,从而可能窃取用户的敏感信息、进行页面篡改等操作,所以 B 选项正确。
  • 选项 C:利用服务器的漏洞进行 SQL 注入是攻击者通过在输入字段中注入恶意的 SQL 语句,从而绕过服务器的验证机制,非法获取或修改数据库中的数据,这是 SQL 注入攻击,并非 XSS 攻击,所以 C 选项错误。
  • 选项 D:通过暴力破解用户的密码是一种尝试使用大量可能的密码组合来猜测用户密码的攻击方式,与 XSS 攻击没有关系,所以 D 选项错误。

2. CSRF(跨站请求伪造)攻击的主要原理是?

A. 攻击者利用用户在已登录网站的身份,在用户不知情的情况下向该网站发送恶意请求
B. 攻击者在网页中插入恶意代码,破坏网页的正常显示
C. 攻击者通过中间人攻击截取用户的网络请求
D. 攻击者利用服务器的漏洞进行文件上传攻击

答案:A

解析

  • 选项 A:CSRF 攻击的原理是攻击者诱导已登录目标网站的用户访问包含恶意请求的页面,由于用户在目标网站已经处于登录状态,浏览器会自动携带用户的身份信息(如 Cookie)向目标网站发送请求,网站会误以为是用户本人发起的合法请求,从而执行攻击者预设的恶意操作,如转账、修改用户信息等,所以 A 选项正确。
  • 选项 B:在网页中插入恶意代码破坏网页正常显示,这更像是一种简单的页面篡改攻击,不属于 CSRF 攻击的范畴,所以 B 选项错误。
  • 选项 C:中间人攻击是攻击者截取用户与服务器之间的通信,获取或篡改其中的数据,与 CSRF 攻击利用用户已登录身份发送恶意请求的原理不同,所以 C 选项错误。
  • 选项 D:利用服务器的漏洞进行文件上传攻击是攻击者通过上传恶意文件来获取服务器权限或执行其他恶意操作,和 CSRF 攻击没有直接关联,所以 D 选项错误。

3. 为了防止 XSS 攻击,在前端代码中对用户输入进行过滤时,以下哪种做法是正确的?

A. 直接将用户输入显示在页面上
B. 对用户输入进行 HTML 实体编码
C. 只允许用户输入数字
D. 不处理用户输入

答案:B

解析

  • 选项 A:直接将用户输入显示在页面上是非常危险的,因为如果用户输入包含恶意脚本,这些脚本会在页面中执行,从而导致 XSS 攻击,所以 A 选项错误。
  • 选项 B:对用户输入进行 HTML 实体编码是防止 XSS 攻击的有效方法之一。例如,将 < 编码为 &lt;> 编码为 &gt;,这样即使输入中包含恶意脚本标签,在页面上也会被当作普通文本显示,而不会被浏览器解析为脚本执行,所以 B 选项正确。
  • 选项 C:只允许用户输入数字会极大地限制用户的输入,在很多场景下并不适用,而且也不能完全防止 XSS 攻击,因为攻击者可能通过其他方式绕过这种限制,所以 C 选项错误。
  • 选项 D:不处理用户输入会使页面完全暴露在 XSS 攻击的风险之下,是不可取的做法,所以 D 选项错误。

多选题

1. 以下哪些措施可以防范 CSRF 攻击?

A. 使用验证码
B. 验证请求来源
C. 检查请求的 Referer 字段
D. 使用 CSRF 令牌

答案:ABCD

解析

  • 选项 A:在关键操作(如转账、修改密码等)中使用验证码,要求用户输入验证码进行验证。由于攻击者无法获取用户输入的验证码,就无法顺利完成恶意请求,从而有效防范 CSRF 攻击,所以 A 选项正确。
  • 选项 B:验证请求来源可以通过检查请求的 IP 地址、用户代理等信息,判断请求是否来自合法的客户端。如果请求来源异常,可以拒绝该请求,减少 CSRF 攻击的风险,所以 B 选项正确。
  • 选项 C:检查请求的 Referer 字段可以判断请求的来源页面。正常情况下,合法的请求应该来自同一网站的页面。如果 Referer 字段显示请求来自其他可疑的网站,那么很可能是 CSRF 攻击,服务器可以拒绝该请求。不过 Referer 字段可以被伪造,所以这只是一种辅助的防范措施,所以 C 选项正确。
  • 选项 D:使用 CSRF 令牌是防范 CSRF 攻击的常用且有效的方法。服务器在生成页面时,会为每个用户生成一个唯一的 CSRF 令牌,并将其包含在页面中。当用户提交请求时,服务器会验证请求中携带的 CSRF 令牌是否与服务器端存储的令牌一致。如果不一致,则拒绝该请求,从而防止 CSRF 攻击,所以 D 选项正确。

2. 以下哪些是常见的前端安全漏洞?

A. XSS 攻击
B. CSRF 攻击
C. SQL 注入
D. 点击劫持

答案:ABD

解析

  • 选项 A:XSS 攻击是常见的前端安全漏洞,攻击者通过注入恶意脚本到网页中,在用户浏览器中执行,可能导致用户信息泄露、页面被篡改等问题,所以 A 选项正确。
  • 选项 B:CSRF 攻击利用用户在已登录网站的身份,在用户不知情的情况下向该网站发送恶意请求,造成用户账户安全问题,是常见的前端安全隐患,所以 B 选项正确。
  • 选项 C:SQL 注入是针对服务器端数据库的攻击方式,攻击者通过在输入字段中注入恶意的 SQL 语句来非法获取或修改数据库中的数据,不属于前端安全漏洞,所以 C 选项错误。
  • 选项 D:点击劫持是一种视觉欺骗的攻击方式,攻击者通过透明的 iframe 或其他手段,诱使用户在不知情的情况下点击隐藏在页面背后的恶意链接或按钮,执行攻击者预设的操作,是常见的前端安全漏洞之一,所以 D 选项正确。

3. 为了防范前端安全漏洞,在开发过程中可以采取以下哪些措施?

A. 对用户输入进行严格验证和过滤
B. 定期更新前端框架和库
C. 使用 HTTPS 协议进行数据传输
D. 对敏感数据进行加密存储

答案:ABCD

解析

  • 选项 A:对用户输入进行严格验证和过滤可以有效防止 XSS 攻击等安全问题。例如,检查输入的长度、格式,对特殊字符进行转义或过滤,确保输入符合预期,避免恶意代码注入,所以 A 选项正确。
  • 选项 B:前端框架和库可能存在安全漏洞,定期更新它们可以及时修复已知的漏洞,提高应用程序的安全性。许多框架和库的开发者会发布安全补丁来解决新发现的安全问题,所以 B 选项正确。
  • 选项 C:使用 HTTPS 协议进行数据传输可以对数据进行加密,防止数据在传输过程中被窃取或篡改。HTTPS 通过 SSL/TLS 协议对数据进行加密,确保数据的保密性和完整性,减少中间人攻击的风险,所以 C 选项正确。
  • 选项 D:对敏感数据进行加密存储可以保护用户的隐私信息。即使攻击者获取了存储数据的数据库,由于数据是加密的,他们也无法直接获取敏感信息,从而提高了数据的安全性,所以 D 选项正确。

简答题

1. 简述 XSS 攻击的类型及防范方法。

答案

  • XSS 攻击类型

    • 反射型 XSS:攻击者将恶意脚本作为参数嵌入到 URL 中,当用户点击包含该恶意 URL 的链接时,服务器会将该参数反射到响应页面中,恶意脚本在用户浏览器中执行。这种攻击通常需要攻击者诱导用户点击特定的链接。
    • 存储型 XSS:攻击者将恶意脚本提交到网站的数据库中,当其他用户访问包含该恶意脚本的页面时,脚本会在用户浏览器中执行。例如,在论坛的留言板中输入恶意脚本,当其他用户查看留言时就会受到攻击。
    • DOM 型 XSS:这种攻击是基于文档对象模型(DOM)的,攻击者通过修改页面的 DOM 结构来注入恶意脚本。与反射型和存储型不同,DOM 型 XSS 不需要服务器参与,完全在客户端进行。
  • 防范方法

    • 输入验证和过滤:对用户输入进行严格的验证和过滤,只允许合法的字符和格式。例如,对于输入的文本,去除或转义其中的特殊字符,如 <>'" 等。
    • 输出编码:在将用户输入显示在页面上时,对其进行 HTML 实体编码、JavaScript 编码或 URL 编码等。例如,将 < 编码为 &lt;,这样可以防止浏览器将输入解析为脚本。
    • 设置 CSP(内容安全策略) :通过设置 CSP 头信息,限制页面可以加载的资源来源,只允许从指定的域名加载脚本、样式表等资源,从而防止恶意脚本的加载和执行。
    • HttpOnly Cookie:对于存储用户身份信息的 Cookie,设置 HttpOnly 属性,这样可以防止 JavaScript 脚本通过 document.cookie 访问 Cookie,减少 XSS 攻击导致的 Cookie 被盗取的风险。

2. 解释 CSRF 攻击的流程及如何防范。

答案

  • CSRF 攻击流程

    1. 用户登录目标网站,浏览器会保存用户的登录凭证(如 Cookie)。
    2. 攻击者诱导用户在已登录目标网站的情况下访问包含恶意请求的页面。这个页面可能是攻击者自己创建的恶意网站,也可能是被攻击者注入了恶意代码的正常网站。
    3. 当用户访问该恶意页面时,浏览器会自动携带用户在目标网站的登录凭证(如 Cookie)向目标网站发送恶意请求。
    4. 目标网站收到请求后,由于请求中携带了有效的登录凭证,会误以为是用户本人发起的合法请求,从而执行攻击者预设的恶意操作,如转账、修改用户信息等。
  • 防范措施

    • 使用 CSRF 令牌:服务器在生成页面时,为每个用户生成一个唯一的 CSRF 令牌,并将其包含在页面的表单或请求头中。当用户提交请求时,服务器会验证请求中携带的 CSRF 令牌是否与服务器端存储的令牌一致。如果不一致,则拒绝该请求。
    • 验证请求来源:检查请求的 Referer 字段或 Origin 头信息,判断请求是否来自合法的来源。如果请求来源异常,可以拒绝该请求。不过需要注意的是,Referer 字段可以被伪造,所以这只是一种辅助的防范措施。
    • 使用验证码:在关键操作(如转账、修改密码等)中要求用户输入验证码进行验证。由于攻击者无法获取用户输入的验证码,就无法顺利完成恶意请求。
    • SameSite 属性:为 Cookie 设置 SameSite 属性,该属性可以限制 Cookie 在跨站请求中的发送。例如,将 Cookie 的 SameSite 属性设置为 Strict 或 Lax,可以有效减少 CSRF 攻击的风险。

3. 什么是点击劫持,如何防范?

答案

  • 点击劫持定义:点击劫持是一种视觉欺骗的攻击方式。攻击者通过创建一个透明的 iframe 或其他手段,将恶意页面隐藏在用户正常访问的页面背后。当用户在正常页面上进行点击操作时,实际上点击的是隐藏在背后的恶意页面上的链接或按钮,从而执行攻击者预设的操作,如关注恶意账号、进行支付等。

  • 防范方法

    • 设置 HTTP 响应头

      • X - Frame - Options:服务器可以在 HTTP 响应头中设置 X - Frame - Options 字段,该字段有三个值可供选择:DENY 表示页面不允许被任何网站以 iframe 形式嵌入;SAMEORIGIN 表示页面只允许被同域名的网站以 iframe 形式嵌入;ALLOW - FROM uri 表示页面只允许被指定的 URI 以 iframe 形式嵌入。
      • Content - Security - Policy(CSP) :通过设置 CSP 头信息,限制页面可以被嵌入的来源。例如,设置 frame - ancestors'self' 表示页面只允许被同域名的网站嵌入。
    • 前端检测:在前端代码中可以通过 JavaScript 检测页面是否被嵌入到 iframe 中。如果检测到页面被嵌入到其他页面中,可以采取相应的措施,如跳转到正常页面或显示警告信息。例如:

if (top !== self) {
    top.location = self.location;
}

上述代码会检查当前窗口是否是顶层窗口,如果不是,则将顶层窗口的 URL 重定向到当前窗口的 URL。

JQuery题库

单选题

1. 以下哪个是 jQuery 选择器用于选择所有 <p> 元素的正确写法?

A. $('p')
B. $('.p')
C. $('#p')
D. $('*p')

答案:A

解析

  • 选项 A:在 jQuery 中,使用标签名作为选择器时,直接将标签名放在引号内,$('p') 会选择文档中所有的 <p> 元素,所以该选项正确。
  • 选项 B$('.p') 是类选择器,它会选择所有带有 p 类名的元素,而不是 <p> 标签元素,所以该选项错误。
  • 选项 C$('#p') 是 ID 选择器,用于选择 ID 为 p 的元素,并非所有 <p> 元素,所以该选项错误。
  • 选项 D$('*p') 不是 jQuery 中的有效选择器写法,所以该选项错误。

2. 要隐藏一个 ID 为 myDiv 的元素,以下 jQuery 代码正确的是?

A. $('#myDiv').show();
B. $('#myDiv').hide();
C. $('.myDiv').hide();
D. $('myDiv').hide();

答案:B

解析

  • 选项 A$('#myDiv').show(); 是用于显示 ID 为 myDiv 的元素,而不是隐藏,所以该选项错误。
  • 选项 B$('#myDiv').hide(); 中,$('#myDiv') 选择了 ID 为 myDiv 的元素,hide() 方法用于隐藏所选元素,所以该选项正确。
  • 选项 C$('.myDiv') 是类选择器,会选择所有带有 myDiv 类名的元素,而不是 ID 为 myDiv 的元素,所以该选项错误。
  • 选项 D$('myDiv') 没有指定选择器类型,这不是正确的 jQuery 选择器写法,无法正确选择元素,所以该选项错误。

3. 在 jQuery 中,ready() 方法的作用是?

A. 当页面所有资源(包括图片等)加载完成后执行代码
B. 当页面 DOM 结构加载完成后执行代码
C. 当用户点击页面时执行代码
D. 当页面滚动时执行代码

答案:B

解析

  • 选项 Awindow.onload 事件或 jQuery 的 $(window).load() 方法(jQuery 3.0 之后已弃用)是在页面所有资源(包括图片、脚本等)加载完成后执行代码,而不是 ready() 方法,所以该选项错误。
  • 选项 B$(document).ready() 方法(也可以简写成 $(function(){}))会在页面的 DOM 结构加载完成后立即执行其中的代码,此时可能图片等资源还未完全加载,所以该选项正确。
  • 选项 C:当用户点击页面时执行代码通常使用 click() 事件绑定方法,如 $('selector').click(function(){}),与 ready() 方法无关,所以该选项错误。
  • 选项 D:当页面滚动时执行代码使用 scroll() 事件绑定方法,如 $(window).scroll(function(){}),和 ready() 方法功能不同,所以该选项错误。

多选题

1. 以下哪些是 jQuery 的事件绑定方法?

A. click()
B. hover()
C. change()
D. animate()

答案:ABC

解析

  • 选项 Aclick() 方法用于绑定点击事件,当用户点击所选元素时,会触发绑定的函数。例如 $('button').click(function(){ alert('Button clicked!'); });,所以该选项正确。
  • 选项 Bhover() 方法用于绑定鼠标悬停和离开事件,它可以接受两个函数作为参数,第一个函数在鼠标悬停时执行,第二个函数在鼠标离开时执行。例如 $('div').hover(function(){ $(this).css('background - color', 'yellow'); }, function(){ $(this).css('background - color', 'white'); });,所以该选项正确。
  • 选项 Cchange() 方法用于绑定表单元素的改变事件,当表单元素(如输入框、下拉框等)的值发生改变时,会触发绑定的函数。例如 $('input').change(function(){ alert('Input value changed!'); });,所以该选项正确。
  • 选项 Danimate() 方法是用于创建自定义动画效果的,它可以改变元素的 CSS 属性值,实现元素的动态变化,不是事件绑定方法,所以该选项错误。

2. 以下哪些可以使用 jQuery 的 attr() 方法操作?

A. 获取元素的属性值
B. 设置元素的属性值
C. 删除元素的属性
D. 获取元素的文本内容

答案:ABC

解析

  • 选项 Aattr() 方法可以用于获取元素的属性值。例如,var hrefValue = $('a').attr('href'); 可以获取第一个 <a> 元素的 href 属性值,所以该选项正确。
  • 选项 Battr() 方法也可以用于设置元素的属性值。例如,$('img').attr('src', 'new_image.jpg'); 可以将所有 <img> 元素的 src 属性值设置为 new_image.jpg,所以该选项正确。
  • 选项 C:使用 removeAttr() 方法可以删除元素的属性,但 attr() 方法结合设置 null 值也可以实现类似删除属性的效果。例如,$('input').attr('disabled', null); 可以移除 input 元素的 disabled 属性,所以该选项正确。
  • 选项 D:获取元素的文本内容使用 text() 方法,而不是 attr() 方法。例如,var textContent = $('p').text(); 可以获取 <p> 元素的文本内容,所以该选项错误。

3. 在 jQuery 中,以下哪些方法可以用于操作元素的 CSS 样式?

A. css()
B. addClass()
C. removeClass()
D. toggleClass()

答案:ABCD

解析

  • 选项 Acss() 方法可以直接操作元素的 CSS 样式。它可以用于获取元素的 CSS 属性值,也可以设置元素的 CSS 属性值。例如,$('div').css('color', 'red'); 可以将所有 <div> 元素的文本颜色设置为红色,所以该选项正确。
  • 选项 BaddClass() 方法用于为元素添加一个或多个类名。通过添加类名,可以应用类名对应的 CSS 样式。例如,$('p').addClass('highlight'); 会为所有 <p> 元素添加 highlight 类,从而应用 highlight 类定义的样式,所以该选项正确。
  • 选项 CremoveClass() 方法用于移除元素的一个或多个类名。移除类名后,元素将不再应用该类对应的 CSS 样式。例如,$('li').removeClass('selected'); 会移除所有 <li> 元素的 selected 类,所以该选项正确。
  • 选项 DtoggleClass() 方法用于切换元素的类名。如果元素已经有指定的类名,调用该方法会移除该类名;如果元素没有指定的类名,调用该方法会添加该类名。例如,$('button').toggleClass('active'); 可以在 button 元素的 active 类存在和不存在之间切换,所以该选项正确。

简答题

1. 简述 jQuery 链式调用的原理和优点。

答案

  • 原理:jQuery 的链式调用是基于其方法返回 jQuery 对象本身的特性实现的。在 jQuery 中,大多数方法在执行完操作后会返回调用该方法的 jQuery 对象,这样就可以在同一个 jQuery 对象上继续调用其他方法,形成一个方法调用链。例如:
$('p')
 .css('color', 'red')
 .hide()
 .fadeIn(1000);

在上述代码中,$('p') 选择所有 <p> 元素,css() 方法执行完设置颜色的操作后返回该 jQuery 对象,接着可以继续调用 hide() 方法隐藏元素,hide() 方法执行后同样返回该 jQuery 对象,再继续调用 fadeIn() 方法实现淡入效果。

  • 优点

    • 代码简洁:链式调用可以将多个操作合并在一行代码中,减少了代码的行数,使代码更加简洁易读。避免了多次重复选择相同的元素,提高了代码的编写效率。
    • 提高性能:由于不需要多次选择相同的元素,减少了 DOM 操作的次数,从而提高了代码的执行效率。每次选择元素都需要遍历 DOM 树,链式调用减少了这种不必要的遍历,提升了性能。

2. 如何使用 jQuery 实现一个简单的表单验证功能?

答案
以下是一个使用 jQuery 实现简单表单验证功能的示例,假设表单中有一个输入框,要求输入不能为空:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF - 8">
    <title>Form Validation</title>
    <script src="https://code.jquery.com/jquery - 3.6.0.min.js"></script>
    <script>
        $(document).ready(function () {
            $('form').submit(function (event) {
                // 获取输入框的值
                var inputValue = $('input').val();
                // 检查输入是否为空
                if (inputValue === '') {
                    alert('输入不能为空!');
                    // 阻止表单提交
                    event.preventDefault();
                }
            });
        });
    </script>
</head>

<body>
    <form>
        <input type="text" placeholder="请输入内容">
        <input type="submit" value="提交">
    </form>
</body>

</html>

步骤解释

  1. 引入 jQuery 库:在 HTML 文件的 <head> 标签中引入 jQuery 库,这里使用的是 jQuery 3.6.0 的 CDN 链接。
  2. 绑定表单提交事件:使用 $(document).ready() 确保 DOM 加载完成后执行代码。通过 $('form').submit() 方法绑定表单的提交事件,当用户点击提交按钮时,会触发绑定的函数。
  3. 获取输入框的值:使用 $('input').val() 方法获取输入框中的值。
  4. 验证输入:检查输入框的值是否为空,如果为空,使用 alert() 弹出提示框,并使用 event.preventDefault() 阻止表单的默认提交行为。

3. 解释 jQuery 中 $(this) 的作用。

答案
在 jQuery 中,$(this) 是一个非常常用的语法,它的作用是将当前 DOM 元素包装成 jQuery 对象,以便可以使用 jQuery 提供的各种方法来操作该元素。

在不同的场景下,$(this) 所代表的元素不同:

  • 事件处理函数中:在事件处理函数中,$(this) 通常代表触发该事件的元素。例如:
$('button').click(function () {
    $(this).css('background - color', 'red');
});

在上述代码中,当用户点击按钮时,$(this) 代表被点击的那个按钮元素,通过 css() 方法将该按钮的背景颜色设置为红色。

  • 循环遍历中:在使用 each() 方法等进行元素遍历时,$(this) 代表当前正在遍历的元素。例如:
$('li').each(function () {
    var text = $(this).text();
    console.log(text);
});

这里 $(this) 在每次循环中分别代表当前遍历到的 <li> 元素,通过 text() 方法获取该元素的文本内容并打印到控制台。

总的来说,$(this) 提供了一种方便的方式来操作当前上下文的 DOM 元素,使代码更加灵活和易于维护。