[TypeScript] 编程实践之1: Google的TypeScript代码风格11:Script和Modules

七步学会TypeScript - 第六步-模块 使用模块来拆分代码和管理依赖。熟悉模块导入和导出的语法。复杂场景下模块如何帮助你更好地组织代码 阅读详情

11 Scripts和Modules

TypeScript实现对ECMAScript 2015模块的支持,并支持针对CommonJS,AMD和其他模块系统的下层代码生成。

11.1 程序和源文件

TypeScript程序由一个或多个源文件组成。

SourceFile:
	ImplementationSourceFile
	DeclarationSourceFile

ImplementationSourceFile:
	ImplementationScript
	ImplementationModule

DeclarationSourceFile:
	DeclarationScript
	DeclarationModule

扩展名为“ .ts”的源文件是包含语句和声明的实现源文件,扩展名为“ .d.ts”的源文件是仅包含声明的声明源文件。

声明源文件是实现源文件的严格子集,用于以附加方式声明与现有JavaScript代码关联的静态类型信息。 它们完全是可选的,但是使TypeScript编译器和工具能够在将现有的JavaScript代码和库集成到TypeScript应用程序中时提供更好的验证和帮助。

编译TypeScript程序时,该程序的所有源文件都会一起处理。 不同源文件中的语句和声明可以相互依赖,可能以循环方式相互依赖。 默认情况下,为编译中的每个实现源文件生成一个JavaScript输出文件,但是声明源文件中不生成任何输出。

11.1.1 源文件依赖

TypeScript编译器自动确定源文件的依赖关系,并将这些依赖关系包含在正在编译的程序中。根据“参考注释”和模块导入声明进行确定,如下所示:

  • //// 形式的注释出现在源文件中的第一个标记添加对path参数中指定的源文件的依赖之前。相对于包含源文件的目录的路径被解析。
  • 指定一个相对模块名称的模块导入声明(第11.3.1节)解析相对于所包含源文件目录的名称。如果存在带有结果路径和文件扩展名“ .ts”的源文件,则将该文件作为依赖项添加。否则,如果存在带有结果路径和文件扩展名“ .d.ts”的源文件,则将该文件添加为依赖项。
  • 指定顶级模块名称的模块导入声明(第11.3.1节)以主机相关的方式解析名称(通常是通过相对于模块命名空间根解析名称,或在一系列目录中搜索名称) 。如果找到具有与引用相对应的扩展名“ .ts”或“ .d.ts”的源文件,则将该文件添加为依赖项。

依次将包含为依赖项的任何文件以引用方式分析其引用,直到确定所有依赖项为止。

11.2 Script

不包含模块导入或导出声明的源文件被分类为脚本。 脚本形成单个全局命名空间,并且脚本中声明的实体在程序中的所有范围内。

ImplementationScript:
	ImplementationScriptElementsopt

ImplementationScriptElements:
	ImplementationScriptElement
	ImplementationScriptElements ImplementationScriptElement

ImplementationScriptElement:
	ImplementationElement
	AmbientModuleDeclaration

ImplementationElement:
	Statement
	LexicalDeclaration
	FunctionDeclaration
	GeneratorDeclaration
	ClassDeclaration
	InterfaceDeclaration
	TypeAliasDeclaration
	EnumDeclaration
	NamespaceDeclaration
	AmbientDeclaration
	ImportAliasDeclaration

DeclarationScript:
	DeclarationScriptElementsopt

DeclarationScriptElements:
	DeclarationScriptElement
	DeclarationScriptElements DeclarationScriptElement

DeclarationScriptElement:
	DeclarationElement
	AmbientModuleDeclaration

DeclarationElement:
	InterfaceDeclaration
	TypeAliasDeclaration
	NamespaceDeclaration
	AmbientDeclaration
	ImportAliasDeclaration

组成全局命名空间的脚本的初始化顺序最终取决于在运行时加载生成的JavaScript文件的顺序(例如,可以由引用生成的JavaScript文件的

11.3 Modules

包含至少一个模块导入或导出声明的源文件被视为单独的模块。 在模块中声明的非导出实体仅在该模块的作用域内,但是可以使用导入声明将导出的实体导入其他模块。

ImplementationModule:
	ImplementationModuleElementsopt

ImplementationModuleElements:
	ImplementationModuleElement
	ImplementationModuleElements ImplementationModuleElement

ImplementationModuleElement:
	ImplementationElement
	ImportDeclaration
	ImportAliasDeclaration
	ImportRequireDeclaration
	ExportImplementationElement
	ExportDefaultImplementationElement
	ExportListDeclaration
	ExportAssignment

DeclarationModule:
	DeclarationModuleElementsopt

DeclarationModuleElements:
	DeclarationModuleElement
	DeclarationModuleElements DeclarationModuleElement

DeclarationModuleElement:
	DeclarationElement
	ImportDeclaration
	ImportAliasDeclaration
	ExportDeclarationElement
	ExportDefaultDeclarationElement
	ExportListDeclaration
	ExportAssignment

模块的初始化顺序由所使用的模块加载程序确定,而TypeScript语言未指定。 但是,通常情况下,非循环相关的模块会以正确的顺序自动加载和初始化。

另外,可以在声明脚本中使用AmbientModuleDeclarations声明模块,该脚本直接将模块名称指定为字符串文字。 第12.2节将对此进行进一步描述。

下面是用单独的源文件编写的两个模块的示例:

// -------- main.ts --------  
import { message } from "./log";  
message("hello");

// -------- log.ts --------  
export function message(s: string) {  
    console.log(s);  
}

“ main”模块中的导入声明引用了“ log”模块,编译“ main.ts”文件会使“ log.ts”文件也作为程序的一部分进行编译。

TypeScript支持模块的多种JavaScript代码生成模式:

  • CommonJS。服务器框架(例如node.js)使用此格式。
  • AMD(异步模块定义)。异步模块加载程序(例如RequireJS)使用此格式。
  • UMD(通用模块定义)。 AMD格式的一种变体,它允许CommonJS加载程序也加载模块。
  • 系统。此格式用于在下层环境中以高保真度表示ECMAScript 2015语义。

所需的模块代码生成模式是通过编译器选项选择的,并且不会影响TypeScript源代码。确实,有可能编写可被编译以在服务器端(例如,使用node.js)和客户端(使用AMD兼容加载程序)上使用的模块,而无需更改TypeScript源代码。

11.3.1 Module命名

使用模块名称标识和引用模块。以下定义与CommonJS Modules 1.0规范中提供的定义一致。

  • 模块名称是一串用正斜杠分隔的术语。
  • 模块名称可能没有文件扩展名,例如“ .js”。
  • 模块名称可以是相对的或顶级的。如果第一个术语是“”,则模块名称是相对的。要么 ”…”。
  • 顶级名称是从概念模块命名空间根目录解析的。
  • 相对名称是相对于它们所在的模块的名称来解析的。

为了解决模块引用,TypeScript将文件路径与每个模块关联。文件路径仅是模块源文件的路径,而没有文件扩展名。例如,包含在源文件“ C:\ src \ lib \ io.ts”中的模块具有文件路径“ C:/ src / lib / io”,而包含在源文件“ C:\ src \ ui \ editor.d.ts”的文件路径为“ C:/ src / ui / editor”。

导入声明中的模块名称解析如下:

  • 如果导入声明指定了相对模块名称,则相对于引用模块文件路径的目录来解析该名称。该程序必须包含具有结果文件路径的模块,否则会发生错误。例如,在文件路径为“ C:/ src / ui / main”的模块中,模块名称“ ./editor”和“ …/lib/io”引用的文件路径为“ C:/ src / ui / editor”和“ C:/ src / lib / io”。
  • 如果导入声明指定了顶级模块名称,并且程序包含AmbientModuleDeclaration(第12.2节),其字符串文字指定了该确切名称,则导入声明将引用该环境模块。
  • 如果导入声明指定顶级模块名称,并且程序不包含带有指定该确切名称的字符串文字的AmbientModuleDeclaration(第12.2节),则以主机相关的方式解析名称(例如,通过考虑相对于名称的名称)模块命名空间根目录)。如果找不到匹配的模块,则会发生错误。

11.3.2 导入声明

导入声明用于从其他模块导入实体,并在当前模块中为其提供绑定。

表格的进口声明

import * as m from "mod";

导入具有给定名称的模块,并为模块本身创建本地绑定。 本地绑定分为一个值(代表模块实例)和一个命名空间(代表类型和命名空间的容器)。

表格的进口声明

import { x, y, z } from "mod";

导入给定的模块并为模块的导出成员的指定列表创建本地绑定。 指定的名称必须每个都引用给定模块的导出成员集中(11.3.4.4)中的一个实体。 本地绑定与其表示的实体具有相同的名称和分类,除非使用as子句指定不同的本地名称:

import { x as a, y as b } from "mod";

表格的进口声明

import d from "mod";

与进口申报完全相同

import { default as d } from "mod";

表格的进口声明

import "mod";

导入给定的模块而不创建任何本地绑定(仅在导入的模块有副作用的情况下才有用)。

11.3.3 Import Require声明

存在导入要求声明以实现与早期版本的TypeScript的向后兼容性。

ImportRequireDeclaration:
	import BindingIdentifier = require ( StringLiteral ) ;

导入require声明引入了引用给定模块的本地标识符。 导入require声明中指定的字符串文字将解释为模块名称(第11.3.1节)。 声明引入的本地标识符成为从引用模块导出的实体的别名,并按照与之完全相同的方式进行分类。 具体来说,如果引用的模块不包含导出分配,则将标识符分类为值和命名空间,如果引用的模块包含导出分配,则将标识符进行分类,就像在导出分配中命名的实体一样。

导入需要以下形式的声明

import m = require("mod");

等效于ECMAScript 2015导入声明

import * as m from "mod";

前提是所引用的模块不包含导出分配。

11.3.4 Export声明

导出声明声明一个或多个导出模块成员。 可以使用导入声明(11.3.2)将模块的导出成员导入其他模块。

11.3.4.1 Export修饰符

在模块的主体中,声明可以通过包含export修饰符来导出声明的实体。

ExportImplementationElement:
	export VariableStatement
	export LexicalDeclaration
	export FunctionDeclaration
	export GeneratorDeclaration
	export ClassDeclaration
	export InterfaceDeclaration
	export TypeAliasDeclaration
	export EnumDeclaration
	export NamespaceDeclaration
	export AmbientDeclaration
	export ImportAliasDeclaration

ExportDeclarationElement:
	export InterfaceDeclaration
	export TypeAliasDeclaration
	export AmbientDeclaration
	export ImportAliasDeclaration

除了在模块的本地声明空间中引入名称之外,导出的声明还在模块的导出声明空间中引入具有相同分类的相同名称。 例如,声明

export function point(x: number, y: number) {  
    return { x, y };  
}

引入了引用该函数的本地名称点和导出的名称点。

11.3.4.2 Export Default声明

导出默认声明为导出名为default的实体提供了简化的语法。

ExportDefaultImplementationElement:
	export default FunctionDeclaration
	export default GeneratorDeclaration
	export default ClassDeclaration
	export default AssignmentExpression ;

ExportDefaultDeclarationElement:
	export default AmbientFunctionDeclaration
	export default AmbientClassDeclaration
	export default IdentifierReference ;

函数,生成器或类的ExportDefaultImplementationElement或ExportDefaultDeclarationElement会在包含模块的导出声明空间中引入一个名为default的值,对于类而言,则引入一个名为default的类型。 声明可以选择为导出的函数,生成器或类指定本地名称。 例如,声明

export default function point(x: number, y: number) {  
    return { x, y };  
}

引入了引用该函数的本地名称点和默认导出名称。 该声明实际上等效于

function point(x: number, y: number) {  
    return { x, y };  
}

export default point;

再次等同于

function point(x: number, y: number) {  
    return { x, y };  
}

export { point as default };

由单个标识符组成的表达式的ExportDefaultImplementationElement或ExportDefaultDeclarationElement必须命名在当前模块或全局命名空间中声明的实体。 该声明在包含模块的导出声明空间中引入了一个名为default的实体,其类别与引用的实体相同。 例如,声明

interface Point {  
    x: number;  
    y: number;  
}

function Point(x: number, y: number): Point {  
    return { x, y };  
}

export default Point;

引入一个本地名称Point和一个默认的导出名称,同时具有值和类型含义。

除单个标识符外,任何表达式的ExportDefaultImplementationElement都会在包含模块的导出声明空间中引入一个名为default的值。 例如,声明

export default "hello";

引入一个名为default的字符串类型的导出值。

11.3.4.3 Export list声明

导出列表声明从当前模块或指定模块中导出一个或多个实体。

ExportListDeclaration:
	export * FromClause ;
	export ExportClause FromClause ;
	export ExportClause ;

不包含FromClause的ExportListDeclaration将从当前模块中导出实体。 在表格的声明中

export { x };

名称x必须引用在当前模块或全局命名空间中声明的实体,并且声明在包含模块的导出声明空间中引入具有相同名称和含义的实体。

带有FromClause的ExportListDeclaration从指定模块重新导出实体。 在表格的声明中

export { x } from "mod";

名称x必须引用指定模块的导出成员集中的实体,并且声明在包含模块的导出声明空间中引入具有相同名称和含义的实体。 没有为x创建本地绑定。

ExportListDeclaration的ExportClause可以指定多个实体,还可以选择指定用于导出实体的不同名称。 例如,声明

export { x, y as b, z as c };

在包含模块的导出声明空间中引入名为x,b和c的实体,其含义分别与分别名为x,y和z的本地实体相同。

指定*而不是ExportClause的ExportListDeclaration称为导出星形声明。 导出星号声明会重新导出指定模块的所有成员。

export * from "mod";

显式导出的成员优先于使用导出星形声明重新导出的成员,如下节所述。

11.3.4.4 导出成员集

通过从一组空的成员E和一组空的已处理模块P开始,然后按如下所述处理模块,以形成E中的全部已导出成员,来确定特定模块的导出成员集。 M包含以下步骤:

  • 将M添加到P。
  • 将M的出口声明空间中的每个成员添加到E中,其名称尚未在E中。
  • 对于M中的每个出口星形声明,如果声明的模块不在P中,则按声明的顺序进行处理。

模块的实例类型是一种对象类型,该对象类型具有模块导出成员集中每个成员的表示值的属性。

如果模块包含导出分配,则该模块也包含导出声明是错误的。 两种出口是互斥的。

11.3.5 Export赋值

存在导出分配是为了与TypeScript的早期版本向后兼容。 导出分配将模块成员指定为要导出的实体,以代替模块本身。

ExportAssignment:
	export = IdentifierReference ;

可以使用导入需求声明(11.3.3)导入包含导出分配的模块,然后导入需求声明引入的本地别名将具有导出分配中命名的标识符的所有含义。

包含导出分配的模块也可以使用常规导入声明(11.3.2)导入,前提是导出分配中引用的实体声明为命名空间或带有类型注释的变量。

假设以下示例位于文件“ point.ts”中:

export = Point;

class Point {  
    constructor(public x: number, public y: number) { }  
    static origin = new Point(0, 0);  
}

当在另一个模块中导入“ point.ts”时,导入别名引用导出的类,并且可以用作类型和构造函数:

import Pt = require("./point");

var p1 = new Pt(10, 20);  
var p2 = Pt.origin;

注意,不要求导入别名使用与导出实体相同的名称。

11.3.6 CommonJS模块

CommonJS Modules定义指定了一种方法,该方法用于编写具有隐式隐私,可以导入其他模块以及显式导出成员的JavaScript模块。 符合CommonJS的系统提供了一个’require’函数,该函数可用于同步加载其他模块以获取其单例模块实例,以及一个’exports’变量,模块可以向其添加属性以定义其外部API。

上面的11.3节中的“ main”和“ log”示例在为CommonJS Modules模式编译时生成以下JavaScript代码:

文件main.js:

var log_1 = require("./log");  
log_1.message("hello");

文件log.js:

function message(s) {  
    console.log(s);  
}  
exports.message = message;

模块导入声明在生成的JavaScript中表示为变量,该变量通过调用模块系统主机提供的“ require”函数进行初始化。 仅当导入模块或引用导入模块的本地别名(第10.3节)被引用为导入模块主体中的PrimaryExpression时,才会为特定的导入模块生成变量声明和’require’调用。 如果仅将导入的模块引用为NamespaceName或TypeQueryExpression,则不会生成任何内容。

一个例子:

文件geometry.ts:

export interface Point { x: number; y: number };

export function point(x: number, y: number): Point {  
    return { x, y };  
}

game.ts文件:

import * as g from "./geometry";  
let p = g.point(10, 20);

“游戏”模块在表达式中(通过其别名“ g”)引用导入的“几何”模块,因此在生成的JavaScript中包含了“要求”调用:

var g = require("./geometry");  
var p = g.point(10, 20);

取而代之的是将“游戏”模块写为仅在类型位置引用“geometry”:

import * as g from "./geometry";  
let p: g.Point = { x: 10, y: 20 };

生成的JavaScript将不依赖于’geometry’模块,而仅仅是

var p = { x: 10, y: 20 };

11.3.7 AMD模块

异步模块定义(AMD)规范扩展了CommonJS Modules规范,提供了一种模式,用于编写具有相关性的异步可加载模块。 使用AMD模式,模块将作为对全局“定义”函数的调用而生成,该函数接受一系列依赖关系(指定为模块名称)以及包含模块主体的回调函数。 全局“定义”功能是通过在应用程序中包含符合AMD要求的加载程序来提供的。 加载程序安排异步加载模块的依赖项,并在完成后调用回调函数,将已解析的模块实例作为自变量按其在依赖项数组中列出的顺序传递为参数。

当为AMD模式编译时,上面的“ main”和“ log”示例生成以下JavaScript代码。

文件main.js:

define(["require", "exports", "./log"], function(require, exports, log_1) {  
    log_1.message("hello");  
}

log.js文件:

define(["require", "exports"], function(require, exports) {  
    function message(s) {  
        console.log(s);  
    }  
    exports.message = message;  
}

始终存在特殊的“需要”和“导出”依赖项。 根据需要,其他条目会添加到依赖项数组和参数列表中,以表示导入的模块。 与CommonJS Modules的代码生成类似,只有在导入模块主体中某处将导入模块引用为PrimaryExpression时,才会为特定的导入模块生成依赖项。 如果仅将导入的模块引用为NamespaceName,则不会为该模块生成依赖关系。

Kiro Spec模式与EARS规范:AI编程中的需求工程实践 AI编程工具的核心瓶颈并非模型能力,而是自然语言需求到可执行代码之间的语义鸿沟。EARS规范作为一种结构化需求表达方法,通过Context(场景)、Goal(目标)、Success Criteria(验收标准)、Constraints(约束)四要素,将模糊描述转化为机器可解析的契约。Kiro将EARS深度集成进Spec模式,构建起需求文档→技术设计→任务拆解的轻量级工程流水线,显著降低沟通返工率。该机制尤其适用于涉及多模块协作、外部API对接或业务规则复杂的Python/JavaScript项目,为团队提供 阅读详情

相关推荐

Mac配置AI编程三件套:Codex、Claude Code与Gemini实战指南

AI编程助手并非通用应用,而是深度耦合开发环境的智能增强层。其核心原理在于模型能力需通过IDE扩展(如VS Code+Copilot)、本地CLI工具链(如Claude Code CLI)或浏览器深度集成(如Chrome+Gemini实验标志)三种技术路径落地。这种架构差异决定了权限控制、芯片兼容性(Apple Silicon专属)、签名验证(Gatekeeper绕过)和上下文安全(代码脱敏/沙箱)等关键工程挑战。技术价值体现在提升代码补全准确率、加速重构响应速度、强化跨栈方案设计能力;典型应用场景覆盖新手

weixin_34072637的博客 497

开源项目 Madge 使用教程

开源项目 Madge 使用教程 项目介绍 Madge 是一个由 Jake Wharton 开发的命令行工具,用于生成模块依赖图的工具。它主要用于分析 JavaScript 和 TypeScript 项目的依赖关系,并生成可视化的依赖图。Madge 支持多种输出格式,包括 DOT、JSON 和 PNG 等,便于开发者理解和优化项目的模块结构。 项目快速启动 安装 Madge 首先,确保你的系统上已经...

gitblog_00330的博客 1035

GitHub Copilot CLI 实战手册:终端里的可编排AI编程工具

命令行接口(CLI)是软件工程中实现自动化、可复现与可集成的核心范式。GitHub Copilot CLI 将大语言模型的代码生成、解释与重构能力封装为符合 Unix 哲学的文本处理工具,支持标准输入/输出、管道串联、脚本调用与 CI 集成。其技术价值在于突破 IDE 和浏览器界面限制,提供上下文感知的离线提示工程能力,使 AI 编程真正融入开发者的终端工作流。典型应用场景包括无 GUI 环境下的代码迁移、批量源码增强(如类型注解与文档生成)、CI 流水线中的变更影响分析等。本文聚焦 GitHub Copi

weixin_33701617的博客 395

[TypeScript] 编程实践之1: Google的TypeScript代码风格7:接口

TypeScript语言规范7 接口7.1 接口声明7.2 声明合并7.3 接口扩展类7.4 动态类型检查 7 接口 接口提供了命名和参数化对象类型并将现有命名对象类型组合为新对象的能力。 接口没有运行时表示—它们纯粹是编译时构造。 接口对于记录和验证所需的属性形状,作为参数传递的对象以及从函数返回的对象特别有用。 因为TypeScript具有结构类型系统,所以具有一组特定成员的接口类型被认为与具有相同成员组的另一个接口类型或对象类型文字相同(并且可以替代)(请参阅第3.11.2节)。 类声明可以在自己的I

魔豆(Magicbean)的博客 468

CLI驱动的AI开发工作流:从终端命令到CI集成的工程实践

CLI(命令行接口)是将大模型能力深度融入软件开发生命周期的核心载体,其本质是可脚本化、可版本化、可管道化的AI客户端。它基于标准HTTP协议调用LLM API,通过本地配置实现上下文编排、Token预算控制与错误码标准化处理,技术价值在于打破网页聊天框的交互局限,让AI能力像git或npm一样成为开发者每日依赖的基础设施。典型应用场景包括自动化代码审查、智能调试辅助、上下文感知的代码生成,以及CI/CD流水线中的AI增强型质量门禁。本文聚焦Claude CLI、Codex CLI与Gemini CLI三类

aocaiti5781的博客 460

避坑指南:ThingsBoard自定义地图Widget从开发到部署的全流程(以高德地图为例)

本文详细介绍了在ThingsBoard平台中开发与部署高德地图Widget的全流程,涵盖从TypeScript编码、Widget打包到生产环境部署的关键步骤。针对前端资源编译、密钥安全管理等核心挑战提供解决方案,并分享性能优化与缓存策略,帮助开发者高效实现工业物联网场景下的地图集成。

weixin_30617695的博客 437

两小时快速入门 TypeScript 基础(二)面向对象

本文介绍了 TypeScript 中的面向对象,从了解 object 对象类型,到熟悉 Interface 接口,到 TS 中 class 类和接口的结合,再到访问修饰符和模块化,最后介绍了泛型的基本使用...

HuoZhiyan 的博客 1812

DeepSeek V4 Pro终端编程实战:用Anthropic协议激活CLI原生AI编码力

终端AI编程助手正从‘插件式辅助’迈向‘原生工作流集成’新阶段。其核心在于兼容主流协议(如Anthropic API)的深度适配,而非简单模型替换——通过协议层改造实现上下文感知、动态推理调度与工具链原生支持。这种架构使开发者无需切换环境即可复用现有CLI习惯,显著降低AI编码的认知负荷与工程摩擦。DeepSeek V4 Pro正是这一范式的典型代表:它以`[1m]`推理模式、`CLAUDE_CODE_EFFORT_LEVEL=max`控制粒度和`ANTHROPIC_BASE_URL`路由重定向,将大模型能

dianzongfan5428的博客 403

[TypeScript] 编程实践之1: Google的TypeScript代码风格1:介绍

TypeScript语言规范1 介绍1.1 环境声明1.2 函数类型1.3 对象类型1.4 结构子类型化1.5 上下文类型推断1.6 类1.7 枚举类型1.8 字符串参数重载1.9 通用类型和功能1.10 命名空间1.11 模块 版本1.8 2016年1月 Microsoft自2012年10月1日起根据Open Web Foundation最终规范协议版本1.0(“ OWF 1.0”)提供此规范。OWF 1.0可以从http://www.openwebfoundation.org/legal/the-owf

魔豆(Magicbean)的博客 1398

Claude Code安装全指南:从零配置终端AI编程环境

Claude Code是一款独立运行的AI编程助手CLI工具,其核心原理是将大模型能力深度嵌入本地开发流,通过终端直接读取项目上下文、生成代码补全与执行shell命令。技术价值在于消除重复劳动、减少文档切换、提升调试效率。典型应用场景包括自动化脚本编写(如C盘垃圾清理)、测试生成、日志分析及Git操作辅助等。本文聚焦Windows/macOS/Linux多平台下的真实环境适配,重点解析PowerShell 7升级、ConPTY兼容性修复、WSL2路径选择及npm非必需性等关键认知误区,帮助开发者绕过‘com

dicha7140的博客 510

OpenClaw本地部署避坑指南:Node.js版本、API兼容性与Gemini参数配置

OpenClaw并非本地AI运行时,而是一个面向多厂商大模型API的协议编排层。其核心原理是将用户指令标准化为各平台(Gemini/Claude/DeepSeek)所需的REST请求格式,并转发调用。技术价值在于快速切换后端的能力,但代价是深度耦合上游API规范变更——如Gemini 1.5新增reasoning_effort参数引发的400错误,或Claude免费账户32K输出token硬限制。典型应用场景包括开发者本地AI代理搭建、NAS轻量级部署及企业级API中转站构建。本文聚焦真实环境中的Node.

weixin_34319374的博客 315

vscode vue3 typescript开发环境搭建

今天搞一下vue3环境,用这玩意看看好使不。vue2早期的语法看起来真实够呛,嵌套比较深。以前看过一个妹子写的react代码,发现里面很多js在控制样式和html,三个东西揉在一块也是厉害了。不知道是不是react本身的风格。vue3本身风格要接近原生js了,提倡组合式API,但是还是有些距离。从语法使用上来说还是早期原生js风格统一,没有各种套路,都是拿来就用,纯组合。这组件方开发感觉看起来不直白,一个页面里面很多自定义组件,不看源码不知道时啥玩意。比如<MyComp/>这时啥玩意?

yanghuashuiyue的专栏 1434

Pipeline本质:可复现、可验证、可协作的自动化执行流

Pipeline是现代软件工程中实现持续集成与交付的核心范式,其本质并非简单脚本或工作流,而是由明确输入、确定性转换和结构化输出构成的原子化执行单元集合。它基于输入即契约、阶段即事务、输出即产物、元数据即生命线四大原则,保障执行的可复现性、可验证性与跨团队协作可靠性。在CI/CD、AI模型训练、IoT固件发布等场景中,Pipeline通过强隔离环境、结构化Artifact传递和深度可观测性,将‘人脑操作序列’转化为‘机器可解析、可审计、可回滚的指令图谱’。理解Pipeline与Script、Workflow

weixin_33980459的博客 461

AI编程辅助的渐进式集成:三层防御与上下文锚点实践

AI编程辅助不是替代开发者,而是增强其认知效率的技术范式。其核心原理在于将大模型能力解耦为可审计、可干预、可收敛的微粒化操作,通过L1机械层自动化、L2半认知层建议+强干预、L3设计决策层人工终审的三层责任划分,保障代码控制权不旁落。技术价值体现在降低重复性认知负荷、提升上下文理解精度、强化边界条件覆盖,并自然支撑单元测试生成、遗留代码解读、API契约定义、错误根因定位等高频工程场景。本文聚焦真实项目中‘上下文锚点’机制与渐进式集成路径,为已有两年以上实战经验的工程师提供可控、可验证、可复用的AI协同方法论

shikun520的专栏 521

dpdm:检测 TypeScript 项目中的循环依赖

dpdm 用于JavaScript和TypeScript项目的静态依赖项分析器。 特征 支持CommonJS 、 ESM 。 完全支持JavaScript和TypeScript 。 支持 TypeScript 。 支持忽略 TypeScript 类型依赖 轻量级:使用解析所有模块。 快速:使用异步 API 加载模块。 稳定输出:这与 madge 相比,其结果在分析TypeScript时完全没有定论。 安装 npm i dpdm # or yarn add dpdm # use as command line npm i -g dpdm # or yarn global add dpdm dpdm --help 在线使用 dpdm.ts [options] files... Options: --version Show version number

ANSYS Fluent DPM实战:从单点到锥形注入的粒子模拟全流程解析

本文深度解析了ANSYS Fluent中离散相模型(DPM)的粒子注入(Injection)设置全流程。从单点注入到锥形喷雾,详细阐述了不同注入类型的物理本质、参数逻辑与适用场景,并提供了粒径分布、湍流扩散等高级参数设置技巧与实战避坑指南,帮助工程师精准模拟喷雾、粉尘等粒子运动行为。

weixin_29276847的博客 654

Terraform入门与工程实践:基础设施即代码核心指南

基础设施即代码(IaC)是现代云原生运维的基础范式,其核心在于将服务器、网络、数据库等资源抽象为可版本化、可测试、可协作的代码。Terraform 作为最主流的声明式 IaC 工具,依托 Provider 插件体系与 state 状态管理机制,实现跨云平台(AWS/Azure/GCP/阿里云)的一致性编排。相比过程式工具如 Ansible 或厂商锁定方案如 CloudFormation,Terraform 以 HCL 语言提供精准 diff、安全回滚与模块化复用能力,显著提升环境一致性、变更可审计性与团队协

weixin_34290631的博客 580

Modbus4J vs EasyModbus4J:哪个Java库更适合你的工业项目?

本文深入对比了Java领域两大Modbus通信库Modbus4J与EasyModbus4J。Modbus4J设计稳健、类型安全,适合复杂业务集成;EasyModbus4J基于Netty,在高并发场景下性能更优。文章从架构、性能、API及生产环境多维度分析,为工业物联网项目选型提供决策依据。

weixin_28475533的博客 310

gpt-cli:基于Gemini的亚百毫秒级AI编程CLI工具

CLI工具是开发者工作流中具备确定性、可审计性与系统级集成能力的基础技术形态。其核心价值在于绕过GUI交互冗余,通过管道化设计实现低延迟、高可控的自动化编程辅助。随着大模型能力下沉至命令行层,以gpt-cli为代表的新型AI CLI正将AST解析、上下文感知、patch生成等能力压缩至亚百毫秒级响应,并深度整合Git、CI/CD与云原生构建体系。它不仅提升单点效率,更支撑团队级AI协作规范、安全策略嵌入与知识沉淀闭环——尤其适用于对可追溯性、合规性与工程效能有严苛要求的中大型研发组织。

weixin_34204722的博客 988

iTunes登录协议逆向与自动化实现:从抓包到3DES加密的完整实战

网络协议逆向与自动化是提升开发与测试效率的关键技术,其核心在于理解客户端与服务器之间的通信原理。通过分析HTTPS请求、逆向加密算法,可以模拟合法客户端行为,实现批量操作自动化,在自动化测试与账号管理等场景中具有重要价值。本文聚焦于iTunes登录协议,深入剖析了其认证流程,并利用Frida动态调试工具成功逆向出关键的3DES加密环节,为开发者提供了一套从协议分析到Python代码实现的完整解决方案。

480

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

Codex插件直连Claude Code:本地进程内委托实现AI编程工作流升级

AI编程助手正从单点问答工具演进为可建模的协作者,其核心瓶颈在于多模型协同时的延迟、上下文一致性与资源效率。本地进程内委托(In-process Delegation)作为一种新型集成范式,绕过HTTP API与跨进程通信,通过复用CLI环境、共享内存与Unix域套接字,显著降低IPC开销并保障Git、FS、Docker等运行时上下文完整性。该技术支撑标准审查、对抗质疑与任务移交三类高信噪比workflow,适用于已具备本地LLM运行能力、熟悉MCP协议及Claude Code Skill系统的进阶开发者,

weixin_30918633的博客 601

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2709
上一篇: [TypeScript] 编程实践之1: Google的TypeScript代码风格10:命名空间
下一篇: [TypeScript] 编程实践之1: Google的TypeScript代码风格12:Ambients
魔豆Magicbean
博客等级 码龄19年 146粉丝 742原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值