0.8.0 中的新功能亮点
0.8.0 版本包括主要是内部更新和修复,用于改进现有特性和功能,而不是用户可见的,以及对某些前端项目的潜在破坏性更改。
-
improvements to codegen from 0.7.7
-
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,您都需要考虑以下事项:
-
识别容器 ID。 输出不再将容器 ID 硬编码为 JavaScript,因此您需要使用自己的策略提供该代码。 其他允许自定义脚本的打包器应该能够重用 webpack 配置逻辑。
-
确定“NODE_ENV”。 在开发过程中,应用程序应该调用
agent.fetchRootKey()
,但它不应该在生产环境中获取根密钥。 -
复制代码生成,就像我们在
dfx new
模板中所做的那样,是可选的。 您仍然可以访问 .dfx 中的 .did.js 和 .did.d.ts 文件,因此如果不方便,您可以选择忽略新的index.js
格式,并继续提供 你自己的 Actor.createActor 模式和以前一样。 -
返回类型 - 如果您不想使用 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.