前端工程化(三)
如何使用 Webpack 优化产出代码?
使用 Webpack 优化产出代码可以通过以下几种方式:
- 压缩代码:在生产环境中,使用 UglifyJSPlugin 或 TerserPlugin 等插件对代码进行压缩,可以减少代码体积,提高加载速度。
- 按需加载:使用动态 import 或 React.lazy 动态加载组件代码,可以实现按需加载,减少初始加载时间。
- 提取公共模块:使用 SplitChunksPlugin 插件将公共模块提取出来,可以减少重复加载,提高性能。
- 使用缓存:通过配置 output 的 filename 选项,使用 contenthash 将静态资源文件名与文件内容相关联,可以在文件内容变化时改变文件名,避免浏览器缓存问题。
- 优化图片资源:使用 image-webpack-loader 或 url-loader 等插件对图片进行压缩和转换,可以减少图片体积,提升性能。
如何为项目创建 package.json 文件?
为项目创建 package.json 文件,可以使用以下两种方法:
-
使用 npm init 命令:
- 打开终端,导航到项目目录。
- 运行
npm init
命令,回答一系列问题(如项目名称、版本、描述等),或使用npm init -y
快速生成一个使用默认值的 package.json 文件。
-
手动创建:
- 在项目根目录下创建一个名为 package.json 的文件。
- 填入基本的 JSON 结构,如项目名称、版本、描述、入口文件等。
什么是前端的 browserslist?它有什么作用?如何配置?
Browserslist 是一个开源项目,旨在帮助前端开发者共享目标浏览器和 Node.js 版本配置。它被广泛应用于各种前端工具,如 Autoprefixer、Stylelint 和 babel-preset-env 等。
作用:通过配置 Browserslist,开发者可以指定目标浏览器和 Node.js 版本,从而确保前端工具能够正确地处理这些特定环境下的兼容性问题。
配置方法:
- 在项目的根目录下创建一个
.browserslistrc
文件,并添加目标浏览器和 Node.js 版本的配置。 - 或者在
package.json
文件中添加browserslist
配置项。
例如,在 .browserslistrc
文件中添加以下内容:
defaults and fully supports es6-module
maintained node versions
或者在 package.json
文件中添加:
{"browserslist": ["defaults and fully supports es6-module","maintained node versions"]
}
常见的图片处理加载器有哪些?
在 Webpack 中,常见的图片处理加载器有以下几种:
- file-loader:将图片等文件作为一个文件输出并返回其公共 URI。
- url-loader:类似于 file-loader,但可以将小于指定字节的图片转换为 DataURL,避免了额外的 HTTP 请求。
- image-webpack-loader:压缩图片的 Webpack 加载器,可以减小图片的体积,提高网页加载速度。
- svg-url-loader:将 SVG 文件转换为 DataURL,避免了额外的 HTTP 请求。
- svg-sprite-loader:将多个 SVG 文件合并成一个 SVG sprite,减少 HTTP 请求,提高网页性能。
- html-loader:可以将 HTML 中的图片资源引用转换为 Webpack 可以处理的模块引用,方便 Webpack 进行打包处理。
Webpack 中,pnpm 相比于其他的包管理工具有什么优势?
在 Webpack 项目中,pnpm 相比于 npm 和 yarn 等包管理工具具有以下优势:
- 更快的安装和更新时间:pnpm 使用独特的方法来安装包,避免重复包,从而加快安装和更新速度。特别是当安装共享依赖的多个包时,pnpm 只会为每个依赖安装一次。
- 更少的磁盘空间使用:由于 pnpm 避免了包重复,它使用的磁盘空间比 npm 和 yarn 更少。
- 更好地支持 monorepos:pnpm 旨在与 monorepo 项目很好地配合使用,这些项目是在单个存储库中包含多个包或模块的项目。
- 更好的对等依赖支持:pnpm 对对等依赖有更好的支持。
- 更清晰的依赖树:pnpm 生成比 npm 和 yarn 更清晰的依赖树,这使得依赖树更容易理解和调试。
然而,值得注意的是,pnpm 可能在某些包或工具的兼容性方面存在问题,因此在选择包管理工具时需要根据项目需求进行权衡。
npm install 和 npm ci 有什么区别?
npm install 和 npm ci 都是 npm(Node Package Manager)提供的命令,用于安装项目依赖,但它们在使用场景和行为上有一些关键的区别:
-
使用场景:
- npm install:通常用于开发环境,当你需要安装一个新的包或者修改 package.json 和 package-lock.json 文件时使用。
- npm ci:主要用于生产环境或持续集成(CI)系统中,它要求存在一个 package-lock.json 文件,并且会严格根据该文件安装依赖。
-
行为差异:
- npm install:在没有 package-lock.json 的情况下,会创建一个,并尝试安装最新满足版本范围的依赖。
- npm ci:不会生成 package-lock.json,只会使用已有的。如果缺少 package-lock.json,npm ci 将会失败。
- npm install:在遇到某些错误时可能不会完全失败,而是尝试继续安装其他包。
- npm ci:在遇到任何错误时会立即停止安装过程,这有助于快速识别问题。
- npm ci:默认情况下不会进行任何网络请求,除非明确需要(比如 package-lock.json 中缺少某些信息)。这使得它在没有网络连接的情况下也能工作。
- npm install:在安装依赖时,会根据 package.json 中的版本范围解析依赖,并可能安装不同版本的依赖。
- npm ci:严格按照 package-lock.json 中的依赖版本进行安装,不会重新解析依赖关系。
如何使用 Webpack 和 Localstorage 实现静态资源的离线缓存?
使用 Webpack 和 LocalStorage 实现静态资源的离线缓存,可以按照以下步骤进行:
- 安装 Webpack 及其相关插件:确保项目中已经安装了 Webpack 及其必要的插件。
- 配置 Webpack:将静态资源打包到特定目录,并安装 workbox-webpack-plugin 插件以生成离线缓存资源列表。
- 配置 Service Worker:通过 Workbox 生成离线缓存资源列表,并在代码中监听资源加载事件。加载成功后,将资源存储到 LocalStorage 中。
- 在页面加载时优先从 LocalStorage 中读取资源:如果资源存在,则直接使用;如果不存在,则从网络请求并更新到 LocalStorage 中。
什么是 webpack?它有什么作用?
Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它将应用程序的各种资源(JavaScript、CSS、图片等)作为模块来处理,并根据模块的依赖关系进行打包和优化,从而生成适用于生产环境的代码。
作用:
- 模块打包:将项目中的各个模块(如 JavaScript、CSS、图片等)打包成一个或多个文件,减少 HTTP 请求数量,提高加载速度。
- 代码分割:通过按需加载(Code Splitting)和动态导入(Dynamic Import)等技术,将代码分割成多个小块,实现按需加载,减少初始加载时间。
- 性能优化:通过压缩代码、提取公共模块、优化图片资源等技术,减少代码体积和加载时间,提高应用程序的性能。
- 兼容性处理:使用 Babel 等工具对代码进行转译,使其能够在不同版本的浏览器和 Node.js 环境中运行。
如何在前端项目中实现多分支部署?
在前端项目中实现多分支部署,通常涉及版本控制和部署流程的管理。以下是一个基本的实现步骤:
- 版本控制:使用 Git 等版本控制工具对项目进行版本控制,并为不同的分支(如开发分支、测试分支、生产分支等)创建相应的代码仓库或分支。
- 构建和测试:在每个分支上进行构建和测试,确保代码的稳定性和正确性。可以使用 Webpack 等工具进行构建,并使用测试框架(如 Jest、Mocha 等)进行测试。
- 部署:将构建后的代码部署到相应的服务器或平台上。可以使用自动化部署工具(如 Jenkins、Travis CI 等)来简化部署过程。
需要注意的是,多分支部署可能会增加项目管理的复杂性和维护成本。因此,在实施多分支部署时,需要根据项目的实际需求和团队的技术能力进行权衡和规划。
如何快速修复 npm 包的紧急 bug?
快速修复 npm 包的紧急 bug 通常涉及以下步骤:
- 定位问题:首先,需要确定问题的来源和范围。可以通过查看错误日志、调试代码或使用测试框架来定位问题。
- 修复代码:一旦定位到问题,就需要对代码进行修复。这可能涉及修改现有的代码、添加新的测试或修复依赖关系等问题。
- 更新 npm 包:修复完代码后,需要更新 npm 包。这通常涉及更新 package.json 文件中的版本号,并运行
npm publish
命令将更新后的包发布到 npm 仓库中。 - 通知用户:最后,需要通知使用该 npm 包的用户或团队,告知他们已修复紧急 bug,并建议他们更新到最新版本。
Babel 是如何将字符串解析成 AST 的? 它是如何进行词法和语法分析的?
Babel 将代码解析为 AST (抽象语法树) 的过程分为以下几个步骤:
-
词法分析(Lexical Analysis):
- 将代码字符串拆解为词法单元(Tokens)。
- 通过正则表达式或解析规则,提取关键字、标识符、操作符等基本构成。
- Babel 使用的词法分析器是
@babel/parser
,支持最新的 JavaScript 语法标准。
-
语法分析(Syntax Analysis):
- 将词法单元组合为语法树结构。
- 根据 ECMAScript 语言规范的语法规则生成抽象语法树 (AST)。
- Babel 的语法分析器基于 Acorn 修改而来,解析结果符合 ESTree 规范。
在浏览器中如何使用原生 ESM 模块?
可以直接使用 <script>
标签并指定 type="module"
,如下所示:
<script type="module">import { myFunction } from './myModule.js';myFunction();
</script>
特点:
- 浏览器会以模块方式加载 JavaScript 文件。
- 模块之间支持
import
和export
。 - 模块默认是严格模式 (
strict mode
)。 - 模块中的代码按需加载,支持延迟执行。
注意事项:
- 使用模块需要确保文件通过 HTTP/HTTPS 提供服务。
- 本地测试时需要启动一个本地开发服务器(如
http-server
)。
Webpack 中的 Loader 和 Plugin 是什么? 二者有什么区别?
-
Loader:
- 用于转换模块的文件类型,类似文件的预处理器。
- 通过指定规则(rules),处理特定类型的文件(如
.css
或.jsx
)。 - 例如,
css-loader
可以解析 CSS 文件,babel-loader
用于将现代 JavaScript 转译成 ES5。
-
Plugin:
- 用于扩展 Webpack 的功能,可以在整个构建周期中执行任务。
- 例如,
HtmlWebpackPlugin
用于生成 HTML 文件,DefinePlugin
用于定义全局变量。
区别:
- Loader 处理文件(转换资源类型),而 Plugin 扩展 Webpack 本身功能。
- Loader 在模块加载时工作,Plugin 在构建生命周期的特定阶段工作。
如何确认前端项目是否依赖某个特定依赖项?
-
通过
package.json
文件:- 检查
dependencies
或devDependencies
字段是否包含该依赖。
- 检查
-
使用命令行工具:
npm ls <package-name> yarn list <package-name>
如果显示依赖路径,则项目中包含该依赖。
-
在代码中搜索:
使用代码编辑器搜索该依赖的import
或require
引用。
合并、打包的原理是什么?请举例一个工具或插件
原理:
- 将多个模块的代码合并为一个或多个输出文件,减少 HTTP 请求数量。
- 分析模块依赖关系,按需加载所需资源。
- 插件会在打包过程中应用优化策略(如压缩、去重)。
示例: Webpack
- 将入口文件依赖的所有模块通过
require
或import
引入。 - 通过内部模块图(Dependency Graph)记录模块之间的关系。
- 输出合并后的文件(
bundle.js
)。
JavaScript 压缩
原理:
- 删除无用代码(如注释、空格、未引用变量)。
- 重命名变量为更短的名字。
- 合并表达式,减少文件体积。
工具:
Terser
: 支持现代 JavaScript 的压缩工具。- 使用
webpack
配合terser-webpack-plugin
自动压缩代码。
前端开发中的 Live-Reload 自动刷新与 HMR 热模块替换有什么区别?
-
Live-Reload 自动刷新:
- 当文件发生变更时,重新加载整个页面。
- 页面状态会丢失。
-
HMR 热模块替换:
- 仅替换变更的模块,不刷新页面。
- 状态保持,例如组件的 UI 和应用状态。
HMR 通过 Webpack 的 webpack-dev-server
或 Vite 等工具实现。
什么是 AST? 它在前端的应用场景有哪些?
AST (抽象语法树) 是代码的结构化表示,包含语法成分及其层次关系。
应用场景:
- 代码转译: 如 Babel 将现代 JavaScript 转译为兼容的版本。
- 代码优化: 如 Terser 压缩代码。
- 静态分析: 如 ESLint 检查代码规范。
- 代码生成: 如 Webpack 打包模块代码。
Webpack 和 Rollup、Parcel 构建工具有什么区别? 各自的优缺点是什么?
特性 | Webpack | Rollup | Parcel |
---|---|---|---|
目标 | 通用构建工具 | 专注于库构建 | 零配置快速构建 |
Tree-shaking | 部分支持(依赖配置) | 原生支持 | 原生支持 |
配置复杂度 | 高 | 中 | 低 |
适用场景 | 应用程序、复杂项目 | 库开发 | 快速开发、零配置场景 |
优点 | 功能强大,生态丰富 | 输出高效,支持 ES 模块 | 快速、支持多语言和自动优化 |
缺点 | 学习成本高 | 插件生态较弱 | 不够灵活,生态较弱 |
如何使用 Webpack 处理内联 CSS?
-
安装相关 Loader:
npm install style-loader css-loader --save-dev
-
配置 Webpack:
在webpack.config.js
中添加规则:module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},],}, };
效果:
css-loader
解析 CSS 文件中的@import
和url()
。style-loader
将 CSS 以<style>
标签插入到 HTML 页面中。-
如何使用 Webpack 配置前端脚手架?
使用 Webpack 配置前端脚手架的过程通常包括以下几个步骤:
- 项目初始化:首先,需要初始化
package.json
文件,可以使用pnpm init
(或npm init
、yarn init
,根据使用的包管理工具而定)来创建。然后,手动创建必要的目录和文件,如src
目录、index.html
文件等。 - 安装依赖:根据项目需求,安装 Webpack 及其 CLI 工具,以及其他必要的 loader 和插件。例如,对于 React 项目,需要安装
react
、react-dom
及其类型定义,还需要安装babel-loader
、css-loader
、style-loader
、html-webpack-plugin
等。 - 配置 Webpack:创建 Webpack 配置文件,如
webpack.base.ts
(或webpack.config.js
),在其中设置入口文件、输出路径、loader 配置、插件配置等。对于不同的环境(开发、生产),可以创建不同的配置文件,如webpack.dev.ts
和webpack.prod.ts
。 - 编写入口文件:在
src
目录下创建入口文件,如index.tsx
(或index.js
),在其中编写应用程序的入口代码。 - 运行 Webpack:在
package.json
文件中添加脚本命令,用于启动 Webpack 的开发服务器和构建生产环境代码。然后,可以使用这些命令来启动开发服务器或构建项目。
如何优化打包大小?
优化 Webpack 打包大小的方法有很多,以下是一些常见的策略:
- 代码分离:使用 Webpack 的入口配置和
splitChunks
插件来实现代码分离,减少单个包的大小。 - 动态导入:通过模块的内联函数调用来分离代码,实现按需加载。
- 压缩代码:使用
TerserPlugin
等插件来压缩 JavaScript 代码,减少体积。对于 CSS,可以使用css-minimizer-webpack-plugin
或其他 CSS 压缩工具。 - 提取 CSS:使用
mini-css-extract-plugin
插件将 CSS 提取到单独的文件中,以减少 JavaScript 包的大小。 - 优化图片和字体:使用
image-webpack-loader
、svgo-loader
等插件来优化图片和字体文件的大小。 - 使用 CDN:将静态资源(如库文件、图片等)托管到 CDN 上,以减少本地服务器的压力和加快资源加载速度。
Grunt 和 Gulp 的工作方式是怎样的?
Grunt 和 Gulp 都是 JavaScript 的任务运行器,用于自动化处理诸如文件压缩、图片优化、代码编译等重复性的任务。它们的工作方式存在一些差异:
- Grunt:基于配置式工作流。开发者需要在
Gruntfile.js
配置文件中声明需要执行的任务和这些任务的配置选项。每个任务可能会有一个或多个目标,每个目标又具有特定的配置。Grunt 根据这些配置执行任务。它使用大量的插件来执行不同的任务,并通过文件间的映射关系来指定源文件和目标文件的路径。 - Gulp:基于代码式工作流。开发者通过编写代码来定义任务的执行流程。Gulp 使用 Node.js 的流(stream)来读取、修改并输出文件,这使得文件处理过程中可以不写入磁盘,直接在内存中完成,从而提高了执行效率。Gulp 通过
.pipe()
方法将多个任务连接起来,形成一个处理链。
如何查看前端项目应该使用的 Node.js 版本?
查看前端项目应该使用的 Node.js 版本的方法有很多,以下是一些常见的方法:
- 查看
package.json
文件:在项目的package.json
文件中,可以找到一个名为engines
的字段,它会列出项目所依赖的 Node.js 版本。例如,"engines": { "node": ">=12.0.0" }
表示该项目需要 Node.js 版本大于等于 12.0.0 才能正常运行。 - 使用终端命令:在项目的根目录下,打开终端或命令提示符,并输入
node -v
命令。执行该命令后,终端会返回当前安装的 Node.js 版本。如果项目中已经指定了兼容的 Node.js 版本,可以确保安装的版本与之兼容。 - 查看依赖包的 Node.js 版本要求:有时候,项目中的某些依赖包可能对 Node.js 版本有特定的要求。可以通过查看这些依赖包的
package.json
文件或文档来了解这些信息。
如何使用 Webpack 进行前端性能优化?
使用 Webpack 进行前端性能优化的方法有很多,以下是一些常见的策略:
- 代码分离:如上所述,通过代码分离可以减少单个包的大小,提高加载速度。
- 预加载和预获取:使用 Webpack 的
preload
和prefetch
功能来优化资源的加载顺序。preload
会以高优先级预加载资源,而prefetch
则会在浏览器空闲时预获取资源。 - 使用 CDN:如上所述,将静态资源托管到 CDN 上可以加快资源加载速度。
- 缓存:通过配置 Webpack 的输出文件名和哈希值来实现浏览器缓存。当文件内容发生变化时,哈希值会改变,从而触发浏览器重新加载新文件。
- 优化打包配置:通过合理配置 Webpack 的打包选项,如
optimization.splitChunks
、optimization.runtimeChunk
等,来优化打包结果。 - 使用 Tree Shaking:Tree Shaking 是一种消除未使用代码的技术。Webpack 内置了对 Tree Shaking 的支持,可以通过配置来实现。
什么是前端脚手架?它有什么作用?
前端脚手架(Scaffold)是一种用于快速搭建项目结构的工具,在 Web 前端开发中得到广泛应用。它提供了一种标准的项目结构和开发的规范,可以帮助团队在短时间内搭建起一个良好的基础框架。前端脚手架的作用包括:
- 项目结构自动生成:根据约定好的项目结构模板自动生成初始的项目文件和目录结构,减少手动创建和配置项目结构的时间。
- 依赖管理和模块打包:集成包管理工具(如 npm、yarn)来管理项目的依赖包,并提供模块打包功能,将各个模块的代码进行打包,减少网络请求,提高页面加载速度。
- 开发规范和工具集成:集成各种开发规范和工具,如代码规范检查工具、单元测试工具、自动化构建工具等,帮助开发者规范代码书写、提高代码质量和可维护性。
- 快速开发和部署:提供快速开发的脚本命令和快速部署的功能,帮助开发者将项目发布到线上环境。
Vite 和 Webpack 在热更新上有什么区别?
Vite 和 Webpack 在热更新上存在一些显著的区别:
- Webpack:需要通过配置项开启热更新功能。在大型项目中,由于需要对整个应用或大部分应用进行打包,热更新过程可能会比较耗时。
- Vite:默认支持热更新和自动刷新功能。它利用现代浏览器支持的 ES 模块特性,只构建正在编辑的文件,从而极大地缩短了启动时间和热更新时间。当模块内容改变时,Vite 直接向浏览器重新请求该模块,而不需要重新编译整个文件,这使得开发过程更加高效。
总的来说,Vite 在热更新方面相比 Webpack 具有更快的速度和更高的效率。
微前端技术主要解决了哪些问题?适用于什么场景?
解决的问题:
-
团队协作:
- 不同团队可以独立开发、部署和维护自己的模块。
- 避免大团队协作的冲突,促进解耦。
-
技术栈兼容:
- 支持多个技术栈并存,不同子应用可以使用 React、Vue 等技术。
-
代码隔离和加载:
- 解决多应用之间的样式、JS 冲突问题。
- 按需加载子应用,提高首屏性能。
-
渐进式迁移:
- 在不重写整个系统的情况下,逐步重构或升级部分功能模块。
适用场景:
- 大型复杂项目: 如多个业务线的管理后台或电商平台。
- 团队自治开发: 独立开发团队负责不同功能模块。
- 渐进式重构: 从老旧的单体应用逐步迁移到现代架构。
如何使用 Webpack 解决开发环境中的跨域问题?
方法: 使用 devServer.proxy
配置代理。
步骤:
-
配置 Webpack 的
devServer
:module.exports = {devServer: {proxy: {'/api': {target: 'http://backend-server.com',changeOrigin: true,pathRewrite: { '^/api': '' },},},}, };
-
解释:
/api
为请求的前缀,WebPack 开发服务器会将其代理到http://backend-server.com
。changeOrigin: true
避免跨域问题。pathRewrite
用于去掉前缀/api
。
-
启动开发服务器,跨域问题自动解决。
前端开发中如何优化网络请求和资源加载?具体怎么实现?
-
减少网络请求数量:
- 合并 CSS、JS 文件。
- 使用图片 Sprite 技术。
- 使用 HTTP/2 多路复用。
-
使用缓存:
- 配置强缓存(
Cache-Control
)。 - 使用文件名哈希(如
[contenthash]
)实现缓存失效。
- 配置强缓存(
-
异步加载资源:
- 懒加载图片和组件(
lazy-loading
)。 - 使用动态
import()
按需加载。
- 懒加载图片和组件(
-
压缩和优化:
- 压缩 CSS、JS 和图片。
- 使用工具如 Terser、ImageMin。
-
服务端优化:
- 配置 CDN 提高资源加载速度。
- 使用服务端渲染 (SSR)。
-
代码拆分:
- Webpack 的
SplitChunksPlugin
分割代码。
- Webpack 的
如何快速搭建前端开发环境并启动项目?
-
初始化项目:
mkdir my-project cd my-project npm init -y
-
安装开发依赖:
npm install webpack webpack-cli webpack-dev-server --save-dev npm install html-webpack-plugin --save-dev
-
创建必要文件:
src/index.js
:入口文件。public/index.html
:HTML 模板文件。
-
配置 Webpack:
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',},plugins: [new HtmlWebpackPlugin({template: './public/index.html',}),],devServer: {port: 8080,open: true,}, };
-
启动开发服务器:
npx webpack-dev-server
常见的前端模块化方案有哪些?请举例说明
-
CommonJS:
- 用于 Node.js 环境,模块通过
require
和module.exports
引入和导出。 - 示例:
// 导出 module.exports = { name: 'CommonJS' }; // 导入 const module = require('./module');
- 用于 Node.js 环境,模块通过
-
ES Modules (ESM):
- 浏览器和现代 JavaScript 支持,使用
import
和export
。 - 示例:
// 导出 export const name = 'ESM'; // 导入 import { name } from './module.js';
- 浏览器和现代 JavaScript 支持,使用
-
AMD (Asynchronous Module Definition):
- 用于浏览器异步加载模块,RequireJS 是典型实现。
- 示例:
define(['dependency'], function (dep) {return { name: 'AMD' }; });
-
UMD (Universal Module Definition):
- 兼容 AMD、CommonJS 和全局变量。
- 示例:
(function (root, factory) {if (typeof module === 'object' && module.exports) {module.exports = factory();} else {root.module = factory();} })(this, function () {return { name: 'UMD' }; });
如何将前端项目的 CommonJS 模块转化为 ESM 模块?
-
使用 Babel 转译:
- 配置
.babelrc
:{"presets": ["@babel/preset-env"] }
- 安装依赖:
npm install @babel/core @babel/preset-env --save-dev
- 转换后可生成 ESM 格式代码。
- 配置
-
手动替换
require
和module.exports
:- 将
require
替换为import
。 - 将
module.exports
替换为export
或export default
。
- 将
npm publish 时,npm script 的生命周期是什么?
-
prepublishOnly
:- 在
npm publish
之前运行(仅发布时触发)。 - 可用于代码打包或验证。
- 在
-
prepare
:- 在
prepublishOnly
之前运行。 - 安装依赖时触发,可用于生成构建文件。
- 在
-
postpublish
:- 在发布完成后运行。
- 可用于通知发布成功。
如何使用 webpack-dev-server 监控文件编译?
-
配置 Webpack:
在webpack.config.js
中启用监控:devServer: {watchFiles: ['src/**/*'], },
-
自动刷新:
修改文件后,浏览器会自动刷新页面。 -
启动开发服务器:
npx webpack-dev-server
什么是 semver?有哪些常见的版本号范围表示方法?
Semver (Semantic Versioning) 是语义化版本号,格式为 MAJOR.MINOR.PATCH
:
- MAJOR: 不兼容的更改。
- MINOR: 向后兼容的新功能。
- PATCH: 向后兼容的错误修复。
版本号范围表示方法:
^1.2.3
: 允许更新到1.x.x
。~1.2.3
: 允许更新到1.2.x
。>=1.0.0 <2.0.0
: 允许从1.0.0
到2.0.0
。
启动前端服务后,如何确定该服务对应的端口号?
-
查看配置:
检查 Webpack 或其他工具的配置文件(如port
字段)。 -
命令行输出:
启动服务时,工具会在控制台输出端口号。 -
默认端口:
webpack-dev-server
默认为8080
。- 可以通过 URL
http://localhost:<port>
验证。
Babel 编译为低版本 ES 时,为什么能编译语法但无法编译 API?
-
语法转换:
- Babel 通过插件(如
@babel/plugin-transform-arrow-functions
)将新语法(如箭头函数)转换为低版本语法。 - 这是静态的语法层级转译。
- Babel 通过插件(如
-
API 转换:
- 新 API(如
Promise
、Map
)属于运行时功能,Babel 无法静态转译。 - 需要通过 polyfill(如
core-js
)来模拟旧环境支持这些 API。
- 新 API(如
相关文章:
前端工程化(三)
如何使用 Webpack 优化产出代码? 使用 Webpack 优化产出代码可以通过以下几种方式: 压缩代码:在生产环境中,使用 UglifyJSPlugin 或 TerserPlugin 等插件对代码进行压缩,可以减少代码体积,提高加载速度。…...
SQLAlchemy: Python中的强大数据库工具
SQLAlchemy: Python中的强大数据库工具 SQLAlchemy是一个功能强大的Python库,广泛应用于数据库操作。它提供了一个灵活的数据库抽象层,可以帮助开发者轻松与关系型数据库进行交互。本文将介绍SQLAlchemy的核心组件、常用功能以及它的优势。 1. SQLAlch…...
scala的泛型特质的应用场景
//泛型特质的应用场景 //作比较找出最大值 //定义一个函数,用来求List元素中的最大值参考代码:object Test4 {def getMax[T](list:List[T])(implicit ev:T > Ordered[T]): T {list.reduce((a:T,b:T)> if(a>b) a else b)}def main(args: Array…...
【C++】重载运算与类型转换(七):成员访问运算符
14.7 成员访问运算符 在迭代器类和智能指针类常常用到解引用运算符(*)和箭头运算符(->)。以如下形式向 StrBlobPtr 类添加这两种运算符: class StrBlobPtr {public:std::string& operator*() const{ auto p …...
论文结论:GPTs and Hallucination Why do large language models hallucinate
GPTs and Hallucination 当一个主题有普遍共识,并且有大量语言可用于训练模型时,大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】,或者主题有争议,或是对主题没有明确共识的情况下,就…...
修改通过 Docker 部署的 WordPress 上传文件的大小
要修改通过 Docker 部署的 WordPress 上传文件的大小,你可以按照以下步骤操作: 进入 Docker 容器:首先,你需要进入 WordPress 容器内部。可以使用如下命令: docker exec -it wordpress /bin/bash其中wordpress是你的 W…...
微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列
参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子,但并不完整,根据上述代码,进行修改完善,实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...
信而泰网络测试仪校准解决方案
一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针&a…...
聊聊在应用层面实现内网穿透功能是否可行
前言 最近接手了供方开发的网关项目,交接文档里面有个内网穿透的功能,一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网,这些公网的业务想访问内网的业务,但因为公网和内网没打通,导致…...
linux 20.04 安装sougou输入法 重启 可视化界面 无法点击
在Linux 20.04(Ubuntu 20.04)系统中安装搜狗输入法后,如果遇到重启后可视化界面无法点击的问题,这通常是由于搜狗输入法或其依赖的输入法框架(如fcitx)与系统的某些部分不兼容所导致的。以下是一些可能的解…...
springboot整合lua脚本在Redis实现商品库存扣减
1、目的 使用lua脚本,可以保证多条命令的操作原子性;同时可以减少操作IO(比如说判断redis对应数据是否小于0,小于0就重置为100,这个场景一般是取出来再判断,再存放进行,就至少存在2次IO,用lua脚…...
lspci简介
lspci命令用于列出系统中所有pci设备信息,其输出信息包括设备的bdf地址(总线号、设备号和功能号)、设备类型、厂商信息等。 lspci命令的基本用法: lspci:列出所有pci设备的详细信息 参数: -v:显示详细信息,包括驱动程序、总线和端口等信息 -t:以属性结构显…...
Java从入门到工作2 - IDEA
2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…...
Mave下载、安装以及idea(2024)进行配置
目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具,也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…...
Spark SQL 执行计划解析源码分析
本文用于记录Spark SQL执行计划解析的源码分析。文中仅对关键要点进行提及,无法面面具到,仅描述大体的框架。 Spark的Client有很多种,spark-sql,pyspark,spark- submit,R等各种提交方式,这里以…...
51c嵌入式~单片机~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…...
【electron】electron forge + vite + vue + electron-release-server 自动更新客户端
基本信息 electron forge vue页面(中文):https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面(英文,中文版下面的tab无法点击):https://www.electronfor…...
FastAPI vs Flask 选择最适合您的 Python Web 框架
文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域,FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能,但是在某些方面有所不同。本文将比较 FastAPI…...
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
我们在使用Ubuntu系统时经常性使用sudo apt install命令安装所需要的软件库,偶尔会出现如下问题: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其…...
Spring Boot整合 RabbitMQ
文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…...
Spring Boot 进阶指南:深入核心与实战技巧
当你掌握了 Spring Boot 的基础开发流程后,可以进一步学习其高级功能和优化技巧,以便在复杂场景中高效开发和维护应用。本篇博客将带你深入探讨 Spring Boot 的核心机制,覆盖配置管理、高级特性以及性能优化等内容。 1. 深入理解 Spring Boot…...
淘宝详情网页爬虫:技术解析与实战指南
引言 淘宝作为中国最大的电商平台之一,拥有海量的商品数据。对于开发者来说,获取淘宝商品详情接口是一个常见的需求。本文将介绍如何使用Python编写爬虫,获取淘宝商品详情信息,并探讨在实际应用中可能遇到的挑战与解决方案。 环…...
远程桌面防护的几种方式及优缺点分析
远程桌面登录是管理服务器最主要的方式,于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码,悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全,攻击者可以利…...
WordPress后门插件Query Console 未授权RCE漏洞复现(CVE-2024-50498)
0x01 产品描述: WP Query Console是一个为...
机器学习经典算法
机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...
Mac/Windows端长期破解myBase8方法(无需安装火绒)
提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...
数据结构:原地移除所有数值等于 val 的元素,删除排序数组中的重复项,数组形式的整数加法
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。 要求时间复杂度为O(N),空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) { int sc…...
python3 re正则入门
Python 中的 re 模块是处理正则表达式的标准库,可以用来匹配字符串模式、提取子字符串、替换文本等。以下是 re 模块的基本用法和常见正则表达式模式入门。 1. 导入模块 在使用正则表达式之前,需要导入 re 模块: import re2. 常用函数 1&a…...
一个用于 SMB/CIFS 网络的 Java 库-JCIFS
1.引言 在网络通信中,服务器消息块(SMB)协议在计算机之间实现文件共享和通信方面发挥着重要作用。对于 Java 开发者来说,由于缺乏对该协议的内置支持,使用 SMB 可能会面临挑战。这时,JCIFS(Jav…...
AI 编程入门:理解核心算法与数据结构基础
在踏上人工智能(AI)编程的奇妙之旅时,掌握核心算法与数据结构基础就像是为自己打造了一把开启知识宝库的万能钥匙。这些基础元素不仅是构建智能系统的基石,更是理解AI如何学习、推理和决策的关键所在。 一、线性回归:从数据中探寻线性关系的基础算法 线性回归是AI编程中…...
js:v-for循环中我希望再次循环七张图片,需要在v-for中嵌套一个v-for还是?
问: div classxxxx v-for(item,index) in data :keyindex div classimgDiv div classimgDivBox /div /div .imgDivBox { .background-img(/assets/images/top_01.png) } 这是现在设置的图片,但是现在我希望遍历一个数组然后遍历top01-top07&…...
【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功
项目场景: 使用MAC电脑,以子账号(非root)的形式登录,连接堡垒机CLB(传统型负载均衡),使用FileZilla(SFTP)进行FTP文件传输。 问题描述: MAC电脑…...
Spring Security授权案例集合
目录 授权前置内容权限表的设计建表和相关说明 用户权限配置内部关键类GrantedAuthority和SimpleGrantedAuthority关键类使用示例 资源访问控制方法一、配置类设置访问控制方法二、注解类设置访问控制(优选) 权限不足的处理方法 授权 前置内容 描述&am…...
自动化中关于文本的xpath定位
selenium中://*[text()内容] appium中://*[text热门] 如果是网页端元素,可以打开console,编写 $x("//div[1]") 判断自己写的xpath是否正确; 如果是appium,settings里面PLugins,下载XPathViewXS…...
数据结构 -- #栈和队列的定义和基本实现
文章目录 栈和队列的基本概念栈栈的顺序存储实现栈的链式存储实现(不带头结点) 队列队列的顺序存储实现队列的链式存储实现(带头结点)入队图解出队图解 总结 若没有相关知识基础,可以先看看下面文章哦🤗👇 线性表 栈和队列的基本概念 栈 栈…...
共享GitLab中CICD自动生成的软件包
0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件,在下载固件时候,而无需打开网页,直接输入地址,弹出的对话框是将固件另存为。 或者进入CICD页面,找到job,在Download的标签上单击右键…...
JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测
JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…...
c# 协变与抗变
协变与抗变 1. 背景 一个简单的例子, public class Sharp {}public class Rectange : Sharp {}上面定义了两个简单的类,一个是图形类,一个是矩形类;它们之间有简单的继承关系:矩形是图形的一种。 接下来是常见的一种里氏替换写法: Sharp sharp = new Rectange();“子…...
Android Studio 创建虚拟设备的详细图文操作教程
本篇文章主要讲解 Android Studio 创建模拟器详细图文操作,包含了每一步的详细操作,便于理解和掌握对模拟的创建。 日期:2024年12月9日 作者:任聪聪 运行效果: 说明:创建运行后,点击右侧如下图…...
高级数据结构-树状数组
介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…...
Android SDK 平台工具版本说明
Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的,但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...
【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现快速排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 6 8 7 9 0 1 3 2 4 5 (说明:第一行是元素个数&a…...
Vue项目打包部署到服务器
1. Vue项目打包部署到服务器 1.1. 配置 (1)修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }(2)检查router下的index.js文件下配置的mode模式。 检查如果模式改…...
写作词汇积累:差池、一体两面、切实可行极简理解
差池 【差池】可以是名词,是指意外的事或错误。 【差池】也可以是形容词,是指参差不齐、差劲或不行。 1. 由于操作不当,导致这次实验出现了【差池】,我们需要重新分析原因并调整方案。(名词,表示意外的事…...
【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明
参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分: EasyCwmp 核心:它包括 TR069 CWMP 引擎,负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel:它包…...
C++ STL学习
首先声明:本文内容全部来自bilibili的【【C】算法竞赛常用 STL 用法】 https://www.bilibili.com/video/BV1L8411y7th/?share_sourcecopy_web&vd_source6548350a40ddeb68e9c477994f630bf0这个视频,在此对up主表示感谢,大家也可以直接去看…...
【源码+文档+调试讲解】校园零售商城微信小程序
摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括校园零售商城微信小程序的网络应用,在外国校园零售商城微信小程序已经是很普遍的方式,不过国内的校园零售商城微信小程序可能还处于起步阶段。校…...
BUUCTF Pwn bjdctf_2020_babystack2 题解
1.下载 checksec 64位 拖入IDA64 定位到main函数 以及后门函数 发现read需要读取输入——nbytes的数字来决定长度 同时nbytes是size_t类型 也就是无符号整型的 所以想到整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 exp:…...
【架构】从 Socket 的角度认识非阻塞模型
文章目录 前言1. 阻塞模型2. 非阻塞模型2.1 Reactor 模型优势2.2 Reactor 模型劣势 后记 前言 近期看了很多中间件的文章,RocketMQ,Dubbo 这些中间件内部的rpc通信都用的是非阻塞的模型。(Netty),这里从 Socket 的角度总结一下。 1. 阻塞模…...
PyTorch练习——张量的四则运算与矩阵运算
练习1: # 导入Torch库 import torch# 创建两个张量 x torch.tensor([1, 2, 3]) y torch.tensor([4, 5, 6])# 执行加法操作 z torch.add(x, y) print("加法结果:", z)# 执行减法操作 z torch.subtract(x, y) print("减法结果…...