阅读视图

发现新文章,点击刷新页面。

HarmonyOS 开发必会 5 种 Builder 详解

HarmonyOS 开发必会 5 种 Builder 详解,建议收藏

万少:华为HDE、鸿蒙极客

个人主页:blog.zbztb.cn/

2025年参与孵化了20+鸿蒙应用、技术文章300+、鸿蒙知识库用户500+、鸿蒙免费课程2套。

如果你也喜欢交流AI和鸿蒙技术,欢迎扣我。

前言

HarmonyOS应用开发中提供了众多的Builder用于实现结构复用,其中有**@Builder**、@LocalBuilder@BuilderParam

wrapBuildermutableBuilde等。

熟练掌握以上的Builder使用更加有利于开发出高质量的HarmonyOS应用。

@Builder装饰器

@Builder装饰器提供了最轻量级的组件结构复用,它不想自定义组件具有自己的生命周期和内部状态,所以运行起来体验和性能要更好,当需要在组件中实现结构复用时,优先使用它!

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      this.MenuItem($r("sys.symbol.position"), "位置")
      this.MenuItem($r("sys.symbol.message"), "信息")
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }

  /**
   * @Builder 装饰器:用于定义一个轻量级的 UI 复用单元
   * 与 @Component 相比,@Builder 更适合简单的、可复用的 UI 片段
   * 该方法可以在 build() 方法中通过 this.MenuItem() 直接调用
   *
   * @param src - 图标资源,使用 Resource 类型支持系统符号或本地资源
   * @param text - 菜单项显示的文本内容
   */
  @Builder
  MenuItem(src: Resource, text: string) {
    Row() {
      SymbolGlyph(src) // 系统符号图标
      Text(text) // 显示的文本
    }
  }
}

效果如图所示。

转存失败,建议直接上传图片文件

@BuilderParam装饰器

@BuilderParam 用于声明一个UI 插槽,让父组件可以向子组件传递自定义的 UI 内容。

/**
 * 自定义组件 MenuItemChild
 * 演示 @BuilderParam 的使用 - 用于接收父组件传递的 UI 结构(类似于 Vue 的 slot 插槽)
 */
@ComponentV2
struct MenuItemChild {
  /**
   * @BuilderParam 装饰器:用于声明一个"插槽"属性,接收外部传入的 UI 构建函数
   * - 允许父组件向子组件传递自定义 UI 内容
   * - = this.defaultBuilder 表示设置默认值,当父组件不传递内容时使用
   * - 类型 () => void 表示一个无参数无返回值的构建函数
   */
  @BuilderParam
  slotBuilder: () => void = this.defaultBuilder

  /**
   * @Builder 装饰器:定义一个轻量级的 UI 构建函数
   * - 这里的 defaultBuilder 作为 @BuilderParam 的默认值
   * - 当父组件不传递 slot 内容时,显示此默认 UI
   */
  @Builder
  defaultBuilder() {
    // 默认结构:当父组件未传入自定义内容时显示
    Button("默认结构")
  }

  /**
   * build 方法:组件的 UI 构建入口
   * - 直接调用 slotBuilder() 来渲染传入或默认的 UI 内容
   */
  build() {
    this.slotBuilder()
  }
}


/**
 * 主页面组件
 * 演示 @BuilderParam 的使用方式:
 * 1. 传入自定义内容:MenuItemChild() { Button("父组件") } - 尾随闭包语法
 * 2. 不传入内容:MenuItemChild() - 使用默认的 defaultBuilder
 * 
 * @Entry 装饰器:标记此组件为应用入口页面
 * @ComponentV2 装饰器:标记此结构体为 UI 组件(V2 版本,性能更优)
 */
@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {

      // 方式1:通过尾随闭包向子组件传递自定义 UI(@BuilderParam 接收)
      MenuItemChild() {
        Button("父组件")
      }

      // 方式2:不传递内容,子组件使用 @BuilderParam 的默认值
      MenuItemChild()

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }
}

效果如图。

@LocalBuilder装饰器

@LocalBuilder的作用和**@Builder**类似,都可以实现组件内的组件复用。但是两者存在区别

传递给子组件的参数中的 this 指向:

  • @Builder:指向子组件(this 上下文改变)
  • @LocalBuilder:指向父组件(this 上下文保持不变)
/**
 * 子组件:演示 @BuilderParam 接收外部传入的 UI 构建函数
 */
@ComponentV2
struct MenuItemChild {
  /**
   * @Local 装饰器:声明组件内的本地状态变量(V2 状态管理)
   */
  @Local title: string = "子组件"
  /**
   * @BuilderParam 装饰器:声明一个 UI 插槽属性
   * - 用于接收父组件传递的 @Builder@LocalBuilder 函数
   * - 必须由父组件提供值(无默认值时)
   */
  @BuilderParam
  slotBuilder: () => void

  build() {
    this.slotBuilder()
  }
}


@ComponentV2
@Entry
struct Index {
  @Local title: string = "父组件"

  @Builder
  MenuItem1() {
    Button(this.title) // 传递时捕获 title 的当前值
  }

  @LocalBuilder
  MenuItem2() {
    Button(this.title) // 始终引用最新的 title 值
  }

  build() {
    Column({ space: 10 }) {
      // 使用 @Builder this.MenuItem1 中的 this 指向的是 MenuItemChild组件
      MenuItemChild({ slotBuilder: this.MenuItem1 })

      // 使用 @LocalBuilder this.MenuItem2 中的 this 指向的是 当前的Index组件
      MenuItemChild({ slotBuilder: this.MenuItem2 })

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }
}

效果如图。

wrapBuilder

@Builder存在一个缺陷:当@Builder方法赋值给变量或者数组后,在UI方法中无法使用。

如以下代码:

@Builder
function btn() {
  Button("按钮")
}

const builderArr: Function[] = [btn]

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      ForEach(builderArr, (item: Function) => {
        item()// 错误:当@Builder方法赋值给变量或者数组后,在UI方法中无法使用。
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

wrapBuilder便是来解决这个问题的:

    1. 动态存储多个 @Builder 供运行时选择使用
    1. @Builder 作为参数传递给其他函数/组件
    1. 在循环、数组等场景中复用 @Builder
/**
 * 数据源:用于 ForEach 循环渲染时传递参数
 */
const titles = ["红牛", "康师傅", "小肥羊"]

/**
 * @Builder 函数:定义一个带参数的 UI 构建函数
 * @param text - 按钮显示的文本
 */
@Builder
function btn(text: string) {
  Button(text)
}


/**
 * wrapBuilder 函数详解
 * ─────────────────────────────────────────────────────────────────
 * 【作用】将全局 @Builder 函数包装成可复用的 WrappedBuilder 对象
 *
 * 【为什么需要 wrapBuilder?】
 * - @Builder 函数本身不能直接赋值给变量、不能放入数组、不能作为参数传递
 * - wrapBuilder 将其转换为普通的 JavaScript 对象,支持以上操作
 *
 * 【语法】
 * let 变量名: WrappedBuilder<[参数类型]> = wrapBuilder(builder函数名)
 *
 * 【本例用法】
 * - 将 wrapBuilder 返回的对象放入数组中存储
 * - 数组类型:WrappedBuilder<[string]>[] 表示存储多个包装后的 builder
 * - 每个元素都可以通过 .builder(参数) 调用原始的 @Builder
 *
 *
 * 【注意】
 * - 只能包装全局 @Builder,不能包装组件内的 @Builder
 * - 参数类型必须与 @Builder 函数签名完全匹配
 * ─────────────────────────────────────────────────────────────────
 */
let globalBuilder: WrappedBuilder<[string]>[] = [wrapBuilder(btn), wrapBuilder(btn)]; //可以放入数组

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      /**
       * 遍历 globalBuilder 数组,调用每个 WrappedBuilder
       * - item: WrappedBuilder<[string]> - 包装后的 builder 对象
       * - item.builder(titles[index]) - 调用原始 @Builder,传入对应参数
       *
       * 执行流程:
       * index=0 → item.builder("红牛") → 渲染 Button("红牛")
       * index=1 → item.builder("康师傅") → 渲染 Button("康师傅")
       */
      ForEach(globalBuilder, (item: WrappedBuilder<[string]>, index: number) => {
        item.builder(titles[index])
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

效果如图。

mutableBuilder

当状态变量是wrapBuilder类型时,状态变量发生改变,UI不会跟随改变。此时可以使用mutableBuilder代替wrapBuilder

wrapBuilder的缺陷:

@Builder
function textBuilder(p: string) {
  Text(p)
}

@Builder
function buttonBuilder(p: string) {
  Button(p)
}

@Entry
@ComponentV2
struct Index {
  @Local message: string = 'init';
  @Local text: WrappedBuilder<[string]> = wrapBuilder(textBuilder);

  build() {
    Column() {
      this.text.builder(this.message) // 预期发生更新,但是实际没有更新
      Button("改变").onClick(() => {
        this.text = wrapBuilder(buttonBuilder); // 点击Button, 页面不会发生更新
      })
    }
  }
}

WrappedBuilder替换为mutableBuilder

  @Local text: MutableBuilder<[string]> = mutableBuilder(textBuilder);

完整代码:

@Builder
function textBuilder(p: string) {
  Text(p)
}

@Builder
function buttonBuilder(p: string) {
  Button(p)
}

@Entry
@ComponentV2
struct Index {
  @Local message: string = 'init';
  @Local text: MutableBuilder<[string]> = mutableBuilder(textBuilder);

  build() {
    Column({ space: 10 }) {
      this.text.builder(this.message) // 预期发生更新,但是实际没有更新
      Button("改变").onClick(() => {
        this.text = wrapBuilder(buttonBuilder); // 点击Button, 页面不会发生更新
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

总结

Builder 类型对比表

Builder 类型 核心作用 this 指向 是否可赋值给变量/数组 响应式更新 典型使用场景
@Builder 轻量级 UI 复用单元 调用处的组件 ❌ 不支持 ✅ 支持 组件内简单 UI 结构复用
@BuilderParam UI 插槽声明 子组件自身 ❌ 不支持 ✅ 支持 父组件向子组件传递自定义 UI 内容
@LocalBuilder 组件内 UI 复用(保持 this 上下文) 定义处的组件 ❌ 不支持 ✅ 支持 需要保持原始 this 上下文的 UI 复用
wrapBuilder 包装 @Builder 为可传递对象 包装后的对象 ✅ 支持 ❌ 不支持 动态存储、数组循环、参数传递
mutableBuilder 可响应式更新的包装器 包装后的对象 ✅ 支持 ✅ 支持 需要响应式更新的动态 Builder 切换

最后

关注我,持续分享鸿蒙开发 + AI 提效的实战技巧。

UniApp开发应用多平台上架全流程:H5小程序iOS和Android

UniApp 开发的应用上架流程因目标平台(如H5、小程序、iOS、Android)而异。以下是 UniApp 应用上架的详细流程和注意事项。

1.H5 上架

H5 应用的上架主要是将应用部署到服务器,并通过域名访问。

1.1打包 H5 应用

1.2部署到服务器

  • 将打包后的文件上传到服务器(如Nginx、Apache)。
  • 配置服务器,确保正确路由和资源加载。

1.3配置域名与 HTTPS

  • 绑定域名,确保用户可以通过域名访问应用。
  • 配置 HTTPS,确保数据传输安全。

1.4测试与发布

  • 在浏览器中访问应用,确保功能正常。
  • 将应用链接分享给用户。

2.小程序上架

以微信小程序为例,其他小程序(如支付宝、百度)流程类似。

2.1打包小程序

2.2上传到微信开发者工具

  • 打开微信开发者工具,选择“导入项目”。
  • 选择打包后的小程序目录,填写 AppID 和项目名称。
  • 点击“确定”导入项目。

2.3调试与测试

  • 在微信开发者工具中调试应用,确保功能正常。
  • 使用真机预览功能,在手机上测试应用。

2.4提交审核

  • 在微信开发者工具中点击“上传”。
  • 填写版本号和项目备注,点击“上传”。
  • 登录微信公众平台,提交审核。

2.5发布

  • 审核通过后,在微信公众平台点击“发布”。
  • 用户可通过微信搜索或扫码使用小程序。

3.iOS 上架

iOS 应用的上架需要通过 App Store 审核。

3.1打包 iOS 应用

  • 使用 HBuilderX 的云打包功能:

    • 打开 HBuilderX,选择“发行” -> “原生App-云打包”。
    • 选择 iOS 平台,配置证书和描述文件。
    • 点击“打包”,生成 .ipa 文件。

对于证书和描述文件的管理,开发者可以使用AppUploader工具直接创建和管理iOS开发者或发布证书,无需钥匙串助手,支持多电脑协同使用,简化证书申请流程。

3.2配置 App Store Connect

  • 登录 App Store Connect。
  • 创建新应用,填写应用名称、描述、截图等信息。
  • 上传应用图标和预览视频。

AppUploader还支持批量上传应用截图和描述信息到App Store Connect,提高效率。

3.3上传应用

  • 使用 Xcode 或 Transporter 工具上传 .ipa 文件到 App Store Connect。

此外,AppUploader工具允许开发者在Windows、Linux或Mac系统中直接上传IPA文件到App Store,无需Mac电脑,比传统工具更高效。

3.4提交审核

  • 在 App Store Connect 中提交应用审核。
  • 填写审核信息,确保符合 Apple 的审核指南。

3.5发布

  • 审核通过后,设置发布日期。
  • 应用会自动发布到 App Store。

4.Android 上架

Android 应用的上架主要通过 Google Play 或其他应用商店。

4.1打包 Android 应用

  • 使用 HBuilderX 的云打包功能:

    • 打开 HBuilderX,选择“发行” -> “原生App-云打包”。
    • 选择 Android 平台,配置签名证书。
    • 点击“打包”,生成 .apk 或 .aab 文件。

4.2配置 Google Play Console

  • 登录 Google Play Console。
  • 创建新应用,填写应用名称、描述、截图等信息。
  • 上传应用图标和预览视频。

4.3上传应用

  • 在 Google Play Console 中上传 .aab 或 .apk 文件。

4.4提交审核

  • 填写应用内容分级和隐私政策。
  • 提交应用审核,确保符合 Google Play 的政策。

4.5发布

  • 审核通过后,设置发布日期。
  • 应用会自动发布到 Google Play。

5.上架注意事项

5.1应用合规

  • 确保应用内容符合各平台的政策和法律法规。
  • 提供隐私政策链接,明确用户数据使用方式。

5.2应用图标与截图

  • 提供高质量的图标和截图,符合平台要求。
  • 确保截图展示应用的核心功能。

5.3版本管理

  • 使用语义化版本号(如 v1.0.0)。
  • 记录版本更新日志,方便用户了解新功能。

5.4测试与优化

  • 在上架前进行全面测试,确保应用稳定运行。
  • 优化应用性能,提升用户体验。

总结

UniApp 应用的上架流程因目标平台而异,但总体包括打包、配置、上传、审核和发布等步骤。通过合理的上架流程和注意事项,可以确保应用顺利发布并触达用户。

flutter接入三方库运行报错:Error running pod install

最近在研究flutter,在flutter中引入第三方webview_flutter后,运行iOS设备时报错,具体报错如下:

Error running pod install

Error launching application on iPhone 15.

看问题时iOS的cocoapod在执行pod install命令下载第三方库时出现问题,如是我们找到项目中ios目录,使用xcode打开项目看看情况,

打开后发现项目包错Module 'webview_flutter_wkwebview' not found,很明显这里第三方没有下载下来

如是我们打开控制台cd 到项目的iOS目录,执行pod install这时候我们能看到控制台提示:/Library/Ruby/Gems/2.6.0/gems/ffi-1.17.0-arm64-darwin/lib/2.6/ffi_c.bundle (LoadError)

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- ffi_c (LoadError)

这个错误表明 Ruby 在尝试加载 ffi_c 时失败了,通常是因为 ffi gem 没有正确安装或与系统 Ruby 不兼容

 重新安装 ffi gem

ffi gem 可能没有正确安装或损坏,可以尝试重新安装。

卸载ffi gem:

gem uninstall ffi

#如果报权限问题就使用

sudogem uninstall ffi

重新安装 ffi gem:

gem install ffi

#如果报权限问题就使用

sudo gem install ffi

升级ruby环境

本地环境很多依赖于默认的ruby环境,所以我们可以使用rvm管理和安装多个版本ruby

安装 rvm:

\curl -sSL get.rvm.io | bash -s stable

安装一个 Ruby 版本(如 3.0.0):

rvm install 3.0.0

rvm use 3.0.0 --default

验证 Ruby 版本:

ruby-v

查看所有ruby:

rvm list

在安装ruby的时候我出现了下面的包错

Error running '__rvm_make -j6',

please read /Users/apple/.rvm/log/1739849439_ruby-3.0.0/make.log

我怀疑指定的OpenSSL版本可能没生效,于是干脆通过brew uninstall openssl命令把最新版本的OpenSSL卸载了,再次执行上面的命令一切正常🎉!

解决方案

如果不局限于安装Ruby 3.0版本,那么可以通过安装更高的Ruby版本解决该问题,可以参考这篇文章RVM - 安装最新Ruby版本。

如果一定要安装Ruby 3.0版本,请安装1.1版本的OpenSSL,并卸载最新版本,同时指定使用HomeBrew安装的OpenSSL完成安装:

安装1.1版本的OpenSSL

brew install openssl@1.1

卸载最新版本的OpenSSL

brew uninstall openssl

指定使用HomeBrew安装的OpenSSL完成安装

rvm install ruby-3.0.0 --with-openssl-dir=brew --prefix openssl

如果不想卸载最新版本,可以通过brew link命令切换(链接)openssl的版本完成安装:

安装1.1版本的OpenSSL

brew install openssl@1.1

切换OpenSSL的版本为1.1

brew link --overwrite openssl@1.1

--overwrite参数的作用是强制切换。如果不使用该参数,可以先执行brew unlink openssl命令后再执行brew link openssl@1.1命令完成切换。

指定使用HomeBrew安装的OpenSSL完成安装

rvm install ruby-3.0.0 --with-openssl-dir=brew --prefix openssl@1.1

执行完成后再次执行pod install 报错: `find_spec_for_exe':can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)

因使用 brew 安装工具导致 ruby 环境错乱, 执行pod install时报错提示找不到 gem 可执行文件

Traceback (most recent call last):    2: from /usr/local/bin/pod:23:in '    1: from /Library/Ruby/Site/2.6.0/rubygems.rb:294:in activate_bin_path'/Library/Ruby/Site/2.6.0/rubygems.rb:275:in `find_spec_for_exe': can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)

解决办法:

重新安装 ruby 环境(默认安装最新版本)

rvm reinstall ruby --disable-binary

运行结果

mruby-1.3.0 - #removing src/mruby-1.3.0 - please waitmruby-1.3.0 - #removing rubies/mruby-1.3.0 - please waitRVM does not have prediction for required space for mruby-1.3.0, assuming 150MB should be enough, let us know if it was not.Checking requirements for osx.Certificates bundle '/usr/local/etc/openssl@1.1/cert.pem' is already up to date.Requirements installation successful.Installing Ruby from source to: /Users/jack/.rvm/rubies/mruby-1.3.0, this may take a while depending on your cpu(s)...mruby-1.3.0 - #downloading 1.3.0, this may take a while depending on your connection...mruby-1.3.0 - #extracting 1.3.0 to /Users/jack/.rvm/src/mruby-1.3.0 - please waitmruby-1.3.0 - #compiling - please waitmruby-1.3.0 - #installing - please waitInstall of mruby-1.3.0 - #completeRequired ruby-2.7.0 is not installed.To install do: 'rvm install "ruby-2.7.0"'

重新安装 cocoapods

 gem install cocoapods

运行结果:

Successfully installed cocoapods-1.9.3Parsing documentation for cocoapods-1.9.3Done installing documentation for cocoapods after 1 seconds1 gem installed

再重新执行pod install就OK

Homebrew,是Mac OS X上的软件包管理工具,使用起来非常方便,安装任意软件包时 brew 会自动下载其依赖;

RubyGems 提供了ruby社区gem的托管服务,主要用于下载、安装使用 ruby 软件包

平常 iOS 开发使用 cocoapods 等工具都是使用 gems 进行安装管理,当使用 brew 安装软件包时有可能因依赖导致 ruby 环境错乱,不建议混合使用(使用 brew 也可以安装 cocoapods 而且很方便)

再次运行项目,又发现新的包错: 'Flutter/Flutter.h not found'

这里这样做

1、为了保守起见先备份ios文件

2、删除iOS文件

3、cd到项目跟目录执行命令重新创建ios项目

flutter create .

4、将备份的ios重要文件替换进来

详细见:www.kindacode.com/article/flu…

佑驾创新:与宁德时代(上海)智能科技有限公司达成战略合作

36氪获悉,佑驾创新公告,公司近期与宁德时代新能源科技股份有限公司的附属公司宁德时代(上海)智能科技有限公司正式签署战略合作协议。双方将本着优势互补、资源共享、互利共赢、共同发展的原则,建立长期、稳定、紧密的战略合作伙伴关系,共同开拓具有全球竞争力的智能化、电动化解决方案,推动在海内外市场实现技术与商业的双重突破。

热门中概股美股盘前普跌,小鹏汽车跌超5%

36氪获悉,热门中概股美股盘前普跌,截至发稿,小鹏汽车跌超5%,理想汽车、阿里巴巴、京东、百度、富途控股跌超3%,哔哩哔哩、蔚来跌超2%,拼多多、网易、微博跌超1%。

ST京蓝:公司股票核查结束,将于3月4日复牌

36氪获悉,ST京蓝公告,此前公告,公司股票自2026年2月27日开市起停牌核查。停牌期间,公司就股价波动的相关事项进行了核查。鉴于相关自查工作已完成,公司股票将于2026年3月4日(星期三)开市起复牌。

华安证券:控股股东拟1亿元至2亿元增持公司可转债并转股

36氪获悉,华安证券公告,公司控股股东安徽国控集团计划在3月4日—3月6日,通过集中竞价或大宗交易购买华安转债并在公司可转债转股期间内转股的方式增持公司股份,累计购买金额不低于1亿元,不超过2亿元,此次购买可转债并完成转股后增持公司A股股份的比例与前次已实施完成的增持计划累计不超过公司总股本的2%。

杉杉股份:若控股股东重整成功,公司实控人将变更为安徽省国资委

36氪获悉,杉杉股份发布公告,公司控股股东杉杉集团及其全资子公司朋泽贸易的重整计划草案已提交债权人会议表决,合并破产重整案第四次债权人会议于3月2日召开。若重整成功,公司的控制权将发生变更,公司控股股东将变更为安徽皖维集团有限责任公司,实际控制人将变更为安徽省国资委。但重整计划尚需相关会议审议表决通过并获得法院批准,结果存在不确定性。公司生产经营正常,未受重大影响。

新加坡据悉拟评估将其发展为实物黄金交易枢纽的可行性

据报道,新加坡金融管理局(MAS)与包括两大黄金做市商瑞银、摩通等多家金融机构会谈,评估把新加坡发展为实物黄金交易枢纽的可行性。知情人士透露,新加坡有意发展成为黄金贸易及仓储枢纽,并获央行及家族办公室等机构支持。而新交所亦正评估市场对新黄金合约的需求。相关规划仍处于初步阶段,不排除未来或有调整。(财联社)

华为杨超斌:全球日均Token消耗量快速增长,过去两年增长近300倍

36氪获悉,在MWC26 巴塞罗那期间,华为ICT BG CEO杨超斌发表主题演讲。杨超斌表示,全球日均Token消耗量快速增长,过去两年增长近300倍,引爆文生视频、智能购物等AI应用;全球行业中已有超3000万个AI Agent协同工作,深入生产、制造、金融等行业。这给移动产业带来前所未有的新机遇,也对网络能力提出新的要求:为支撑AI多模态的端云数据交互,网络需从过去以下行为主,迈向上下行超大带宽;为实现AI实时协同与智能决策,网络需提供安全、可靠、超低时延的体验。

上期所调整燃料油期货相关合约涨跌停板幅度和交易保证金比例

36氪获悉,上期所发布通知,经研究决定,自2026年3月4日(星期三)收盘结算时起,涨跌停板幅度和交易保证金比例调整如下: 燃料油期货fu2609、fu2610、fu2611、fu2612、fu2701、fu2702、fu2703合约的涨跌停板幅度为12%,套保持仓交易保证金比例为13%,一般持仓交易保证金比例为14%。 如遇《上海期货交易所风险控制管理办法》第十三条规定情况,则在上述涨跌停板幅度、交易保证金比例基础上调整。 关于涨跌停板和交易保证金的其他事项按《上海期货交易所风险控制管理办法》及相关业务规则执行。

Claude CLI 从安装到使用完整教程(Windows 版)

Claude Code 是 Anthropic 官方推出的命令行 AI 编程助手,可以直接在终端中与 Claude 对话,帮助你完成代码编写、调试、重构等任务。本教程带你在 Windows 系统上从零开始,快速上手 Claude CLI。


一、环境准备

在安装 Claude CLI 之前,需要确保你的系统满足以下条件:

  • Node.js:版本 18 及以上
  • npm:包管理工具(随 Node.js 一同安装)
  • 操作系统:Windows 10 / Windows 11
  • 终端:推荐使用 PowerShell 5.1+Windows Terminal
  • 网络:能正常访问 Anthropic API,如果有自备的公益API也行,例如anyrouter

安装 Node.js

前往 nodejs.org 下载最新 LTS 版本的 Windows 安装包(.msi),按向导完成安装,安装时勾选"自动安装必要工具"选项。

安装完成后,打开 PowerShell 验证版本:

node --version
# 输出示例:v24.14.0

npm --version
# 输出示例:11.9.0

01-flowchart-install-flow.png

二、安装 Claude CLI

打开 PowerShell(以管理员身份运行),执行全局安装命令:

npm install -g @anthropic-ai/claude-code

提示:如果安装时报权限错误,请右键点击 PowerShell 选择"以管理员身份运行"后重试。

安装完成后,验证安装是否成功:

claude --version

更新到最新版本

npm update -g @anthropic-ai/claude-code

解决 PATH 问题

如果提示 claude 不是可识别的命令,需要将 npm 全局包路径加入系统 PATH:

# 查看 npm 全局包安装路径
npm config get prefix

将输出的路径(如 C:\Users\你的用户名\AppData\Roaming\npm)添加到系统环境变量 PATH 中:

  1. 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
  2. 在"用户变量"中找到 Path,点击"编辑"
  3. 点击"新建",粘贴上述路径
  4. 确定保存后,重新打开 PowerShell 使其生效

三、配置 API Key

Claude CLI 需要 Anthropic API Key 才能正常工作。

获取 API Key

  1. 访问 console.anthropic.com
  2. 注册或登录账号
  3. 进入 API Keys 页面
  4. 点击 Create Key 生成新的 API Key

设置环境变量(PowerShell)

临时设置(仅当前会话有效):

$env:ANTHROPIC_API_KEY = "sk-ant-xxxxxxxxxxxxxxxx"

永久设置(推荐):

方法一:通过 PowerShell 命令写入用户环境变量:

[System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", "sk-ant-xxxxxxxxxxxxxxxx", "User")

方法二:通过系统界面设置:

  1. 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
  2. 在"用户变量"区域点击"新建"
  3. 变量名填写 ANTHROPIC_API_KEY,变量值填写你的 API Key
  4. 确定保存,重新打开 PowerShell 使其生效

验证环境变量已生效:

echo $env:ANTHROPIC_API_KEY

四、基础使用

启动交互模式

在项目目录下打开 PowerShell,运行 claude,进入交互式对话:

cd C:\Users\你的用户名\projects\your-project
claude

进入后,你会看到提示符,可以直接输入问题或指令。

单次查询模式

使用 -p 参数执行一次性查询:

claude -p "解释这个项目的目录结构"

处理文件

让 Claude 分析或修改特定文件:

claude -p "审查 src/index.js 中的代码,找出潜在的 bug"

五、核心功能演示

代码生成

> 用 Python 写一个读取 CSV 文件并计算每列平均值的脚本

代码解释

> 解释 @src/utils/parser.ts 这个文件的作用

代码重构

> 重构 @components/Button.jsx,将 class 组件改为函数组件,并添加 TypeScript 类型

调试协助

> 我的应用报错:TypeError: Cannot read property 'map' of undefined,帮我分析原因

生成测试

02-infographic-features-overview.png

> 为 @src/api/user.js 中的所有函数生成单元测试

六、常用命令与快捷键

操作 命令 / 快捷键
启动 Claude claude
单次查询 claude -p "问题"
查看帮助 claude --help
清空对话 /clear
退出 /exitCtrl+C
查看历史 /history

常用 Slash 命令

  • /help — 查看所有可用命令
  • /clear — 清除当前对话上下文
  • /compact — 压缩对话历史以节省 Token
  • /model — 切换使用的模型
  • /cost — 查看本次会话的 Token 消耗

七、项目上下文管理

CLAUDE.md 文件

在项目根目录创建 CLAUDE.md 文件,Claude 会自动读取其中的内容作为项目背景:

# 项目说明

这是一个 React + TypeScript 的电商平台前端项目。

## 技术栈
- React 18
- TypeScript 5
- Tailwind CSS
- Zustand 状态管理

## 编码规范
- 使用函数组件和 Hooks
- 组件文件使用 PascalCase 命名
- 工具函数使用 camelCase 命名

在 PowerShell 中快速创建该文件:

New-Item -Path "CLAUDE.md" -ItemType File
notepad CLAUDE.md

引用文件

在对话中使用 @文件路径 引用具体文件:

> 参考 @src/components/Card.tsx 的风格,创建一个新的 Modal 组件

八、高级配置

配置文件

Claude CLI 支持通过配置文件自定义行为,配置文件位于:

  • 全局C:\Users\你的用户名\.claude\settings.json
  • 项目.claude\settings.json

在 PowerShell 中查看全局配置目录:

explorer "$env:USERPROFILE\.claude"

示例配置:

{
  "model": "claude-opus-4-6",
  "theme": "dark",
  "autoApprove": false
}

权限模式

Claude CLI 有三种权限模式:

  • 默认模式:每次文件修改都需要用户确认
  • 自动批准--dangerously-skip-permissions 自动执行所有操作(谨慎使用)
  • 只读模式:仅读取文件,不做修改

九、最佳实践

  1. 使用 Windows Terminal:比默认 PowerShell 窗口体验更好,支持多标签和彩色输出
  2. 始终在项目根目录启动:这样 Claude 能更好地理解项目结构
  3. 编写详细的 CLAUDE.md:提供技术栈、编码规范等背景信息
  4. 明确描述需求:越具体的指令,生成的结果越准确
  5. 分步执行复杂任务:将大任务拆分为小步骤,逐一确认
  6. 定期使用 /compact:长对话时压缩上下文,避免 Token 超限

十、常见问题

Q: 提示 claude 不是内部或外部命令

检查 npm 全局包路径是否在 PATH 中,参考"安装 Claude CLI"章节中的 PATH 配置步骤。

# 查看 npm 全局包路径
npm config get prefix

Q: PowerShell 提示脚本执行被禁止?

以管理员身份运行 PowerShell,执行以下命令允许本地脚本运行:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Q: API 请求失败,返回 401 错误?

检查 ANTHROPIC_API_KEY 环境变量是否正确设置,或 Key 是否已过期:

echo $env:ANTHROPIC_API_KEY

Q: 响应速度慢?

可以切换到更快的模型,如 claude-haiku-4-5

/model claude-haiku-4-5-20251001

总结

Claude CLI 是一个强大的 AI 编程助手,将 Claude 的能力无缝集成到你的开发工作流中。通过本教程,你已经掌握了在 Windows 上从安装配置到日常使用的完整流程。建议在实际项目中多加练习,充分利用 Claude 的能力提升开发效率。

更多文档请参考官方文档:docs.anthropic.com/claude-code

如果你喜欢本教程,记得点赞+收藏!关注我获取更多AI相关干货

中国石油:短期油价波动存在较大不确定性

36氪获悉,中国石油发布股票交易异常波动公告称,公司A股股票2月27日、3月2日和3月3日连续三个交易日内收盘价格涨幅偏离值累计超过20%。近期国际原油市场受地缘局势、供需格局等多重因素影响,价格呈现宽幅震荡走势,短期油价波动存在较大不确定性,请投资者注意风险。
❌