0.8.0 中的新功能亮点

0.8.0 版本包括主要是内部更新和修复,用于改进现有特性和功能,而不是用户可见的,以及对某些前端项目的潜在破坏性更改。

  1. improvements to codegen from 0.7.7

  2. set-wallet command no longer requires --force flag

迁移到 dfx 0.8.0 的说明

如果您的项目没有依赖于在 .dfx/local 下生成的 JavaScript 文件的前端,则不应期望 dfx 0.8.0 有任何问题。

如果您有一个依赖 dfx 生成的前端文件的现有项目,则在升级到 0.8.0 时可能需要进行一些调整。 根据您的情况,您可能希望选择设置环境变量或进行最少的更改。 我们将在这里记录这两种情况。

### 环境变量

在 webpack 中,我们使用 EnvironmentPlugin 提供环境变量。 在 webpack.config.js 的顶部,我们从根目录 canister_ids.json.dfx/local 中读取,将容器 ID 映射到环境变量中,然后替换 process.env 在开发期间或构建时代码中的值。

// webpack.config.js
let localCanisters, prodCanisters, canisters;

try {
  localCanisters = require(path.resolve(".dfx", "local", "canister_ids.json"));
} catch (error) {
  console.log("No local canister_ids.json found. Continuing production");
}

function initCanisterIds() {
  try {
    prodCanisters = require(path.resolve("canister_ids.json"));
  } catch (error) {
    console.log("No production canister_ids.json found. Continuing with local");
  }

  const network =
    process.env.DFX_NETWORK ||
    (process.env.NODE_ENV === "production" ? "ic" : "local");

  canisters = network === "local" ? localCanisters : prodCanisters;

  for (const canister in canisters) {
    process.env[canister.toUpperCase() + "_CANISTER_ID"] =
      canisters[canister][network];
  }
}
initCanisterIds();

对于您的bundler,无论是 Webpack 还是您选择的其他bundler,您都需要考虑以下事项:

  1. 识别容器 ID。 输出不再将容器 ID 硬编码为 JavaScript,因此您需要使用自己的策略提供该代码。 其他允许自定义脚本的打包器应该能够重用 webpack 配置逻辑。

  2. 确定“NODE_ENV”。 在开发过程中,应用程序应该调用 agent.fetchRootKey(),但它不应该在生产环境中获取根密钥。

  3. 复制代码生成,就像我们在 dfx new 模板中所做的那样,是可选的。 您仍然可以访问 .dfx 中的 .did.js 和 .did.d.ts 文件,因此如果不方便,您可以选择忽略新的 index.js 格式,并继续提供 你自己的 Actor.createActor 模式和以前一样。

  4. 返回类型 - 如果您不想使用 dfx 提供的文件,请考虑使用我们提供的 JSDoc 注释。 如果代码知道您的 actor 具有 ActorSubclass<_SERVICE> 的类型,那么对于您的特定服务,开发过程在兼容的编辑器中得到显着增强。

您可以继续在 URL 中使用查询参数,您可以通过以下方式访问它

// src/example_assets/src/index.js
import { idlFactory as example_idl } from 'dfx-generated/example/example.did.js';
import canisterIds from '../../../.dfx/local/canister_ids.json'

const example_id = new URLSearchParams(window.location.search).get("exampleId") || canisterIds.example.local;

const agent = new HttpAgent();
agent.fetchRootKey();
const example = Actor.createActor(example_idl, { agent, canisterId: example_id });

您可以修改 aliases 减速器以指向路径,而不是硬编码旧的 <canister-name>.js 文件

// webpack.config.js

// Old
["dfx-generated/" + name]: path.join(outputRoot, name + ".js"),
// New
["dfx-generated/" + name]: path.join(outputRoot),

然后,您可以像往常一样执行“dfx deploy”并访问您的工作站点 http://localhost:8000/?canisterId=ryjl3-tyaaa-aaaaa-aaaba-cai&exampleId=rrkah-fqaaa-aaaaa-aaaaq-cai.