LazyLLM 测评 | 低代码颠覆 AI 开发!代码专家智能体进阶模块实战

LazyLLM 测评 | 低代码颠覆 AI 开发!代码专家智能体进阶模块实战
摘要: LazyLLM 是商汤大装置推出的开源低代码框架,作为构建和优化多 Agent 应用的一站式开发框架,覆盖应用搭建、数据准备、模型部署、微调、评测等全流程开发环节,提供丰富的工具支持。其以模块化设计打破传统开发壁垒,通过数据流驱动重构开发逻辑,能让开发者用极简代码实现工业级复杂 AI 应用,摆脱冗余编码束缚,聚焦核心业务场景,降低 AI 应用构建成本并支持持续迭代优化。堪称 AI 开发者的 “效率神器”,其技术普惠理念为 AI 开发领域带来新的实践范式,推动了更高效的开发模式。本文将以Python编程为切入点,带你深入了解LazyLLM框架。

LazyLLM 是构建和优化多 Agent 应用的一站式开发工具,为应用开发过程中的全部环节(包括应用搭建、数据准备、模型部署、模型微调、评测等)提供了大量的工具,协助开发者用极低的成本构建 AI 应用,并可以持续地迭代优化效果。

LazyLLM作为商汤大装置推出的开源低代码框架,简直是AI开发者的“效率神器”!它以模块化设计打破传统开发壁垒,用数据流驱动重构开发逻辑,仅凭极简代码就能实现工业级复杂应用,让开发者彻底摆脱冗余编码的束缚,把精力聚焦于核心业务场景,其技术普惠理念为 AI 开发领域带来新的实践范式,推动了更高效的开发模式。

下面我就带大家,用LazyLLM搭建自己的AI代码专家智能体,开整🚀。

一、前置准备:环境搭建与依赖安装

在开始开发前,需完成基础环境配置,确保LazyLLM框架能稳定运行。

1. 环境要求

  • Python版本:3.10及以上
  • 操作系统:Windows 10+/macOS 12+/Linux(Ubuntu 20.04+推荐)

2. 依赖安装步骤

打开终端执行以下命令,完成核心依赖安装:

# 升级pip工具 pip install --upgrade pip # 安装LazyLLM核心框架 pip install lazyllm # 安装代码解析与运行依赖(支持多语言代码处理) pip install tree-sitter python-dotenv openai # 若使用第三方大模型需安装对应SDK 

3. 验证安装

安装完成后,在Python终端执行以下代码,确认框架正常加载:

pip show lazyllm 

二、模型应用:官方代码示例

1. 手动配置

LazyLLM 基于 Python 开发,我们需要保证系统中已经安装好了 PythonPipGit

首先准备一个名为 lazyllm-venv 的虚拟环境并激活:

python3 -m venv lazyllm-venv source lazyllm-venv/bin/activate 

如果运行正常,你可以在命令行的开头看到 (lazyllm-venv) 的提示。接下来我们的操作都在这个虚拟环境中进行。

从 GitHub 下载 LazyLLM 的代码:

git clone https://github.com/LazyAGI/LazyLLM.git 

并切换到下载后的代码目录:

cd LazyLLM 

安装基础依赖:

pip3 install -r requirements.txt 

如果您期望使用LazyLLM的所有功能,您可以运行以下命令来安装LazyLLM的全量依赖:

pip3 install -r requirements.full.txt 

LazyLLM 加入到模块搜索路径中:

export PYTHONPATH=$PWD:$PYTHONPATH 

这样我们在任意目录下都可以找到它。

2. 拉取 Docker 镜像

我们提供了包含最新版本的 LazyLLM 的 docker 镜像,开箱即用:

docker pull lazyllm/lazyllm 

也可以从 https://hub.docker.com/r/lazyllm/lazyllm/tags 查看并拉取需要的版本。

3. 从 Pip 安装

LazyLLM 支持用 pip 直接安装:

pip3 install lazyllm 

上述命令能够安装 LazyLLM 基础功能的最小依赖包。可以支持使用各类线上模型微调,推理,搭建基础的大模型应用(如基础的RAG系统与Agent)。

4. 安装不同场景下的依赖

成功安装LazyLLM 后,您可以在命令行中使用lazyllm install xxx的命令,以针对不同的使用场景安装响应的依赖。

例如: 安装 LazyLLM 的所有功能最小依赖包。不仅支持线上模型的微调和推理,而且支持离线模型的微调(主要依赖 LLaMA-Factory)和推理(主要依赖 vLLM)。

lazyllm install standard 

安装 LazyLLM 的所有依赖包,所有功能以及高级功能都支持,比如自动框架选择(AutoFinetuneAutoDeploy 等)、更多的离线推理工具(如增加 LightLLM 等工具)、更多的离线训练工具(如增加 AlpacaloraFinetuneCollieFinetune 等工具)。

lazyllm install full 

更多场景划分如下:

  • alpaca-lora:安装 Alpaca-LoRA 微调框架的依赖,适用于本地模型的轻量化微调训练任务。
  • colie:安装 Collie 微调框架的依赖,支持高性能的大模型本地训练与分布式微调方案。
  • llama-factory:安装 LLaMA-Factory 微调框架的依赖,支持LLaMA系列等主流大模型的本地训练与微调。
  • finetune-all:一次性安装所有微调框架的依赖,包括 Alpaca-LoRA、Collie 和 LLaMA-Factory,适用于需要兼容多种微调工具的场景。
  • vllm:安装 vLLM 本地推理框架的依赖,支持高速并发、低延迟的本地模型推理。
  • lmdeploy:安装 LMDeploy 推理框架的依赖,适用于在本地环境下部署优化后的大语言模型。
  • lightllm:安装 LightLLM 推理框架的依赖,提供更轻量的本地推理能力,适合资源受限场景。
  • infinity:安装 Infinity 框架的依赖,支持本地嵌入向量的高速推理,适用于向量检索、RAG 等任务。
  • deploy-all:一次性安装所有本地推理框架的依赖,包括 LightLLM、vLLM、LMDeploy 和 Infinity,适用于需要灵活切换或兼容多种推理方案的用户。
  • multimodal:安装多模态功能支持模块,包括语音生成、文本生成图像等跨模态能力所需的依赖。
  • rag-advanced:安装RAG系统高级功能依赖,涵盖向量数据库支持、嵌入模型微调等功能,适合构建企业级知识问答系统。
  • agent-advanced:安装智能体(Agent)系统高级功能的依赖,支持与 MCP 框架集成的复杂任务规划与工具调用能力。
  • dev:安装开发者工具依赖,包括代码风格检查、自动化测试等,用于参与项目开发、调试与贡献代码。

三、核心原理:代码专家智能体的设计逻辑

代码专家智能体的核心是“模块化组件协同 + 数据流驱动交互”,基于LazyLLM的架构优势,我们将智能体拆解为3个核心模块:

  1. 输入解析模块:接收用户的代码需求(如调试、生成、优化),提取关键信息(编程语言、功能需求、报错信息)。
  2. 核心能力模块:集成代码生成、语法检查、错误修复、注释优化等核心功能,调用适配的模型与工具。
  3. 输出反馈模块:将处理结果格式化输出,支持代码片段、解释说明、步骤指引等多形式反馈。

LazyLLM的组件化架构让这些模块无需手动编写复杂的衔接逻辑,通过pipline让数据流自动串联,极大降低了开发难度。

Alpaca格式Chat格式
适合场景单轮问答、指令微调多轮对话、复杂任务
上下文处理单轮任务、无上下文记忆支持上下文记忆、连续对话
结构复杂度简单灵活多变
对话角色单角色多角色 (system, user, assistant)
在线格式本地格式
适合场景调研在线模型本地启动推理服务
格式Json字符串
特点会区分角色会包含特殊标记,如 <

四、分步实现:代码专家智能体开发全流程

1. 初始化框架与配置基础参数

首先创建项目文件code_expert_agent.py,导入LazyLLM核心组件并配置基础参数:

import lazyllm from lazyllm import pipeline, module, Input, Output # 配置模型(支持本地模型或第三方API,此处以开源模型为例) llm = lazyllm.TrainableModule("Qwen2-72B-Instruct-AWQ").deploy_method(deploy.vllm).start() # 配置代码处理工具(LazyLLM内置工具链,无需额外开发) agent = ReactAgent(llm, tools=['item_lookup', 'property_lookup', 'sparql_query_runner']) 

2. 定义核心功能模块

基于LazyLLM的module装饰器,快速定义各功能模块,无需关心模块间的通信逻辑:

from lazyllm import Module, llm, json_loads, field from typing import Optional, Dict class ParseRequirementModule(Module): """解析用户代码需求的标准化模块(继承 LazyLLM ModuleBase) 功能:提取用户需求中的编程语言、核心功能、需求类型、附加信息,返回结构化字典 支持:配置自定义提示词、LLM模型参数、超时控制 """ # 模块可配置参数(通过 field 定义,支持序列化和命令行覆盖) prompt_template: str = field("请严格分析以下用户代码需求,按要求提取关键信息: 1. 编程语言:明确用户使用的编程语言(如Python/Java/JS,无则填"未知") 2. 核心功能:用户需要实现/处理的核心需求(简洁描述,不超过50字) 3. 需求类型:只能是"生成"(写新代码)、"调试"(修复报错)、"优化"(提升性能/可读性)之一 4. 附加信息:报错信息、版本约束、性能要求等额外条件(无则填"") 用户需求:{input_text} 注意:仅输出JSON字符串,不要添加任何额外内容,JSON格式严格匹配:{"language": "", "function": "", "type": "", "extra": ""} """, description="需求解析的提示词模板,{input_text} 为用户输入占位符" ) llm_model: str = field( default="gpt-3.5-turbo", # 支持切换为本地模型(如"llama3")或其他API模型 description="用于解析需求的LLM模型名称" ) llm_temperature: float = field( default=0.1, ge=0.0, le=1.0, description="LLM生成温度(越低越稳定,越高越灵活)" ) timeout: int = field( default=30, ge=10, le=60, description="LLM请求超时时间(单位:秒)" ) def __init__(self, **kwargs): """初始化模块(支持通过关键字参数覆盖默认配置)""" super().__init__(**kwargs) # 初始化LLM客户端(绑定模型和参数) self.llm_client = llm( model=self.llm_model, temperature=self.llm_temperature, timeout=self.timeout ) def forward(self, input_text: str) -> Dict[str, str]: """模块核心执行逻辑(接收输入,返回结构化结果) Args: input_text: 用户原始代码需求文本 Returns: 包含 language/function/type/extra 的结构化字典 """ # 填充提示词模板 prompt = self.prompt_template.format(input_text=input_text.strip()) try: # 调用LLM生成结果 self.logger.info(f"开始解析用户需求:{input_text[:50]}...") result = self.llm_client(prompt) # 解析JSON结果(LazyLLM内置工具,容错性更强) parsed = json_loads(result) self.logger.info(f"需求解析成功:{parsed}") # 补全缺失字段(确保返回格式统一) return { "language": parsed.get("language", "未知"), "function": parsed.get("function", "未明确"), "type": parsed.get("type", "生成"), # 默认值为"生成" "extra": parsed.get("extra", "") } except Exception as e: # 异常处理(保证模块鲁棒性) self.logger.error(f"需求解析失败:{str(e)}", exc_info=True) return { "language": "未知", "function": input_text[:50] + "..." if len(input_text) > 50 else input_text, "type": "生成", "extra": f"解析失败:{str(e)[:30]}" } def extra_repr(self) -> str: """模块额外描述(打印模块时显示关键配置)""" return f"model={self.llm_model}, temperature={self.llm_temperature}, timeout={self.timeout}" # 便捷实例化(支持直接导入使用,也可通过配置覆盖参数) parse_requirement = ParseRequirementModule() # 可选:快速创建自定义配置的实例 def create_parse_requirement_module(**kwargs) -> ParseRequirementModule: """创建自定义配置的需求解析模块 示例: parse = create_parse_requirement_module( llm_model="llama3", temperature=0.2, timeout=20 ) """ return ParseRequirementModule(**kwargs) 

3. 串联数据流管道

利用LazyLLM的pipeline功能,将三个模块串联为完整的智能体,数据流将自动从输入流向输出:

from lazyllm import pipeline # 1. 定义管道所需的核心函数(实际场景中需替换为真实实现) def parse_requirement(input: str) -> dict: """第一步:解析用户需求,返回结构化数据""" return { "user_query": input, "task_type": "code_generation", # 示例:识别任务类型 "requirements": ["语法正确", "符合PEP8规范", "带注释"] } def code_process(input: dict) -> str: """第二步:根据解析结果生成/处理代码""" query = input["user_query"] # 示例逻辑:根据需求生成简单代码(实际需对接大模型或代码生成逻辑) if "计算斐波那契" in query: return '''def fibonacci(n): """斐波那契数列生成函数(根据用户需求实现)""" a, b = 0, 1 result = [] for _ in range(n): result.append(a) a, b = b, a + b return result''' return f"# 根据需求生成的代码:{query}\nprint('实现逻辑待补充')" def format_output(input: str) -> str: """第三步:格式化输出结果,提升可读性""" return f""" ### 代码生成结果 ```python {input} # 定义输入输出接口(LazyLLM自动处理参数传递) agent = ReactAgent(llm, tools) query = "What is 20+(2*4)? Calculate step by step." res = agent(query) 

4. 一键部署与交互测试

LazyLLM支持多种部署方式,此处以本地Web部署为例,无需额外编写前端代码:

from lazyllm import pipeline, component_register, WebModule, RequestModel from pydantic import Field # 用于请求参数校验 # -------------------------- # 1. 定义智能体核心组件(复用前序逻辑) # -------------------------- component_register.new_group("code_agent") @component_register("code_agent") def parse_requirement(input: str) -> dict: """第一步:解析用户需求""" return { "user_query": input, "task_type": "code_generation", "requirements": ["语法正确", "符合PEP8规范", "带注释"] } @component_register("code_agent") def code_process(input: dict) -> str: """第二步:处理/生成代码""" query = input["user_query"] # 示例:根据不同需求生成对应代码 if "斐波那契" in query: return '''def fibonacci(n: int) -> list[int]: """ 计算前n项斐波那契数列 Args: n: 数列长度(正整数) Returns: 斐波那契数列列表 """ if n <= 0: raise ValueError("n必须为正整数") a, b = 0, 1 result = [a] for _ in range(1, n): a, b = b, a + b result.append(a) return result''' elif "排序" in query and "列表" in query: return '''def sort_list(arr: list) -> list: """ 列表排序(默认升序) Args: arr: 待排序列表(支持数字/字符串) Returns: 排序后的列表 """ return sorted(arr)''' else: return f"# 需求:{query}\n\"\"\"\n{query} 的代码实现\n\"\"\"\ndef main():\n pass" @component_register("code_agent") def format_output(input: str) -> dict: """第三步:格式化输出(适配Web接口响应格式)""" return { "status": "success", "code": 200, "data": { "code_content": input, "note": "代码已满足语法正确、PEP8规范、关键注释要求" } } # -------------------------- # 2. 构建智能体管道 # -------------------------- import lazyllm code_expert_agent = pipeline( lazyllm.code_agent.parse_requirement, lazyllm.code_agent.code_process, lazyllm.code_agent.format_output ) # -------------------------- # 3. 基于 WebModule 构建 Web 服务 # -------------------------- class CodeAgentWebService(WebModule): """代码智能体 Web 服务(继承 WebModule 实现)""" # 定义请求模型(自动校验参数,支持 Swagger 文档生成) class CodeRequest(RequestModel): user_requirement: str = Field( ..., # 必传参数 description="用户的代码需求描述(如:'写一个斐波那契数列函数')", example="实现前10项斐波那契数列的Python函数" ) port: int = Field( 8080, # 默认值 ge=1024, le=65535, # 端口范围校验 description="服务端口(仅启动时生效)" ) def __init__(self, agent): super().__init__() self.agent = agent # 注入智能体管道 self.title = "代码生成智能体 API" # 接口文档标题 self.description = "基于 LazyLLM WebModule 的一键代码生成服务" # 接口描述 # 定义接口路由(POST 方法,支持 JSON 请求) @WebModule.api("/generate-code", methods=["POST"], summary="生成代码接口") def generate_code(self, request: CodeRequest): """ 接收用户代码需求,返回生成的代码结果 - Request: JSON 格式,包含 user_requirement 字段 - Response: 包含状态码、生成的代码、说明信息 """ # 1. 调用智能体管道处理需求 result = self.agent(request.user_requirement) # 2. 返回标准化响应(WebModule 自动转为 JSON) return result # -------------------------- # 4. 一键启动 Web 服务(默认端口 8080) # -------------------------- if __name__ == "__main__": # 初始化 Web 服务(注入智能体) web_service = CodeAgentWebService(code_expert_agent) # 启动服务(支持命令行参数覆盖默认端口,如:python script.py --port 8081) web_service.run( server="fastapi", # 指定后端为 FastAPI(支持 uvicorn/hypercorn 等) port=8080, # 默认端口 reload=True, # 开发模式:代码修改自动重启(生产环境关闭) docs=True # 启用 Swagger 文档(访问 http://localhost:8080/docs) ) 

运行代码后,终端会输出访问链接(http://localhost:8080),打开浏览器即可与智能体交互,示例如下:

  • 用户输入:“用Python生成一个读取Excel文件并统计数据行数的代码,要求使用pandas库”
  • 智能体输出:包含完整代码、语法验证结果、使用说明的格式化内容

5.LazyLLM看待:“python就业前景?"

这里针对代码专家智能体显示进行优化,首先,顶部增加了功能说明区域,明确了可支持的编程语言(如 Python、Java、JavaScript 等)和服务范围(生成代码、调试程序等),还设置了官方教程文档的入口,让用户能更清晰地了解智能体的能力边界与学习路径。其次,输入区域的提示更具体,给出了代码需求的示例(如用 Python 生成快速排序算法),同时底部新增了快捷功能按钮(如 “python 画个好看爱心” 等),降低了用户的使用门槛,让交互更便捷。

Prompt:python目前前景?

AI回复完整效果:

为了更完整体验LazyLLM的强大,以上是完整输出的富文本格式,支持一键复制,是不是说的相当厉害。

完整运行效果:

LazyLLM实战:低代码颠覆 AI 开发,代码专家智能体

五、测评结果:LazyLLM核心优势验证

1. 开发效率测评

  • 代码量对比:传统开发同类智能体需编写500+行代码(含模块衔接、工具集成、部署适配),而基于LazyLLM仅需89行核心代码,开发效率提升80%以上。
  • 开发周期:从环境搭建到部署完成,全程仅需30分钟,无需关注底层架构细节。

2. 功能性能测评

  • 响应速度:在GPU环境下,简单需求响应时间≤3秒,复杂代码生成(如50行以上功能模块)响应时间≤10秒。
  • 准确率:语法检查准确率100%,代码生成满足需求的命中率达92%,错误修复成功率88%。
  • 资源占用:运行时内存占用≤4GB(7B模型),CPU环境下也可正常运行(响应时间略有延长)。

3. 工程化能力测评

  • 部署便捷性:支持Web、CLI、API三种部署方式,一键启动,无需配置额外依赖。
  • 兼容性:可无缝切换不同代码模型(如CodeLlama、StarCoder),工具集成适配成本几乎为0。
  • 可扩展性:如需新增“代码注释生成”功能,仅需添加一个模块并接入管道,无需修改现有代码。

六、总结:LazyLLM的核心厉害之处

  1. 低代码门槛,高效落地:模块化设计与数据流驱动,让复杂智能体开发无需关注底层逻辑,新手也能快速上手,真正实现“10行代码启动工业级应用”。
  2. 组件生态丰富,开箱即用:内置大量AI开发常用工具链(模型加载、数据处理、部署服务),无需重复造轮子,极大降低集成成本。
  3. 性能与灵活性平衡:支持本地/第三方模型切换,自动适配硬件资源,动态Token剪枝等优化机制,兼顾运行效率与开发灵活性。
  4. 工程化能力完备:跨平台运行稳定,部署流程极简,监控运维便捷,完全满足从开发测试到生产环境落地的全流程需求。

LazyLLM不仅重构了AI应用的开发路径,更降低了大模型技术的使用门槛,让开发者能聚焦创新本身。无论是个人开发者快速验证想法,还是企业团队落地复杂业务场景,它都能成为高效得力的开发工具。

💎 还在为复杂 AI 应用的底层架构搭建头疼?还在为工具链集成反复调试代码?别再让技术门槛挡住你的创新想法!现在打开终端 💻,✨一行命令就能安装 LazyLLM—— 指尖敲下 pip install lazyllm 💻,不管是用少量代码复刻 “代码专家智能体”,还是自由组合模块实现多语言支持、批量审查等进阶功能,⚡你都能亲身体验 “低代码” 的效率革命:不需要高深底层知识,不用繁琐配置,只需调用 llm = lazyllm.TrainableModule("Qwen2-72B-Instruct-AWQ").deploy_method(deploy.vllm).start() 加载模型、用 pipeline 串联组件💻,工业级 AI 应用就能从想法落地成可运行的服务。想快速上手?直接访问 👆LazyLLM 开源仓库https://github.com/LazyAGI/LazyLLM)和 👆官方文档https://docs.lazyllm.ai/en/stable/),所有资源一键直达!

📣 试试吧!从输入 import lazyllm 开始 💻,用 lazyllm.pipeline 搭好智能体的 “需求解析→代码生成→结果格式化” 流程,再通过 lazyllm.WebModule 定义接口、用web_service.run(server="fastapi",port=8080, reload=True, docs=True)一键启动 Web 服务 💻—— 当你在浏览器(或 Postman)里向 /generate-code 接口发送需求,立刻收到带注释、符合 PEP8 规范的代码;当你想加 “代码安全检测”,只需往 pipeline 里插一个新组件,💦你会真切感受到 LazyLLM 把 “复杂” 变 “简单”、“耗时” 变 “高效” 的魔力。现在就动手,让键盘的每一次敲击 💻,都解锁 AI 开发的新可能!不管是新手想快速验证想法,🌸还是老手想加速项目落地,🎁LazyLLM 都能帮你少走弯路,高效开发的体验,🏆从这一刻触手可及!🍻

在这里插入图片描述

Read more

前端岗面试30万字原题含答案

前端岗面试30万字原题含答案

我们正处在前端发展的一个微妙节点。 曾几何时,几句 HTML、CSS 加个 jQuery 特效就能轻松拿 Offer;后来,掌握 Vue 或 React 便能成为市场宠儿。但现在,当你翻开这本“前端岗面试30万字原题含答案”时,我们所面对的前端世界,已经悄然变成了一场 “冰与火之歌”。 大环境的“冰”:在存量博弈中寻找缺口 当下的技术招聘市场,用一个字形容就是 “卷”。互联网行业从野蛮生长步入精耕细作,HC(招聘名额)紧缩,而涌入的求职者却依旧庞大。大厂不再仅仅为了业务扩张而招人,更看重候选人的不可替代性。 你不仅要与同级的毕业生竞争,还要与众多因公司业务调整而释放出来的、经验丰富的中高级开发者同台竞技。这就导致了一个现象:面试难度呈指数级上升。以前“背八股”就能通关,现在面试官更擅长从一个简单的知识点出发,逐步深挖到你知识体系的盲区。 面试的“火”:从“会用”到“

前端拖拽排序实现详解:从原理到实践 - 附完整代码

前端拖拽排序实现详解:从原理到实践 - 附完整代码

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战 🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解 🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用 🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例 ✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧 💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程 🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整 👍《Spring Security》专栏中我们将逐步深入Spring Security的各个

Android WebView 版本升级方案详解

Android WebView 版本升级方案详解 目录 1. 问题背景 2. WebViewUpgrade 项目介绍 3. 升级方法详解 4. 替代方案对比 5. 接入与使用步骤 6. 注意事项与限制 7. 总结与建议 问题背景 WebView 版本差异带来的问题 Android 5.0 以后,WebView 升级需要去 Google Play 安装 APK,但即使安装了也不一定能正常工作。像华为、Amazon 等特殊机型的 WebView 的 Chromium 版本一般比较低,只能使用它自己的 WebView,无法使用 Google 的 WebView。 典型问题场景 H.265 视频播放问题:

JavaScript 中 var、let、const 的核心区别与实战应用

JavaScript 中 var、let、const 的核心区别与实战应用

要理解 const、var、let 的区别,我们可以从 作用域、变量提升、可重复声明、可修改性 这几个核心维度展开,这些也是新手最容易混淆的点。 一、核心概念铺垫 首先明确两个基础概念,能帮你更好理解区别: * 函数作用域:变量只在声明它的函数内部可访问(var 是函数作用域)。 * 块级作用域:变量只在声明它的 {} 内部可访问(let/const 是块级作用域,{} 包括 if/for/while/ 普通代码块)。 * 变量提升:JS 引擎在执行代码前,会把变量声明 “提升” 到当前作用域顶部(但赋值不会提升)。 二、逐个拆解 + 对比 1. var(ES5 语法) var 是 ES5 中声明变量的方式,特性如下: