# 编程日记：创建Hardhat（2022-08-27）

By [Corror](https://paragraph.com/@corror) · 2022-08-27

---

编程学习
----

### 做了什么？

1.  成功理解了 `yarn init` 的作用。
    
2.  成功了解 dependencies 和 devDependencies 之间的区别，从而了解 `yarn add --dev hardhat` 中 `--dev` 的作用。
    
3.  成功了解了 npm, npx 和 yarn 之间的关系，从而了解了 `npx hardhat` 和 `yarn hardhat` 命令的原理。
    
4.  成功创建了 hardhat javascript 样板项目。
    
5.  成功了解了 `@organization/package` 这一包命名规则。
    

**_td_** 了解 hardhat 样板项目的框架，包括：scripts, test 文件夹，以及其它的文件。

### 有什么收获？

#### `yarn init` CLI Command

来源：[Yarn init cli command](https://www.w3resource.com/yarn/yarn-init-cli-command.php)

`yarn init` 用来交互式地创建 `package.json` 文件，为项目添加 meta information 元信息。

元信息包括 "name", "version", "description", "author", "license" 等，具体内容如下：

![Project Meta Information](https://storage.googleapis.com/papyrus_images/8666dca3ea01c54f5dc2b4d552dbf0a048622960bcc710c85d7b24afcdbf28fb.png)

Project Meta Information

#### dependencies vs devDependencies

来源：

*   npm - [Specifying dependencies and devDependencies in a package.json file](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)
    
*   node.js 中文网 - [npm 依赖与开发依赖](http://nodejs.cn/learn/npm-dependencies-and-devdependencies)
    
*   node.js - [npm dependencies and devDependencies](https://nodejs.dev/en/learn/npm-dependencies-and-devdependencies)
    
*   CSND - [你真的理解devDependencies和dependencies区别吗?](https://blog.csdn.net/achenyuan/article/details/80899783)
    
*   掘金 - [你应该知道的dependency](https://juejin.cn/post/6979168589160923167)
    

dependencies 指依赖，devDependencies 指开发依赖，它们属于五种 dependency 当中的其中两种。

dependencies 和 devDependencies 的**区别在于目的**：

*   devDependeies 开发依赖，只用于本地的开发 (develop) 和测试 (test), 其他人使用项目时无需用到这些包。
    
*   dependencies 依赖，则用于应用的生产，最终其它使用该项目的人也需要用到。比如：部署 (deploy).
    

#### npm, nps and yarn

🔻npm

参考：Stack Overflow - [Difference between npx and npm?](https://stackoverflow.com/a/52018825/14640362)

npm 是 node page management, 即包管理器，它负责安装包和存放包，但是不负责简化包的执行过程。

比如，如果我们想要下载并安装 `solc` 包，那么我们需要经历如下步骤：

1.  安装 `solc` 包：
    

1.  在 `package.json` 文件当中，将 LCI 编写为脚本
    

    {
        "scripts": {
            "script": "command line"
        }
    }
    

1.  运行命令行：
    

    npm run script
    

🔻npx

参考：掘金 - [npx和npm的关系](https://juejin.cn/post/6844903945664462855)

npx 是 node package executer, 即包执行器，它负责帮助我们更加快捷地执行包命令。

比如：

1.  自动安装所缺少的包：当我们执行 `npx hardhat` 时，如果没有安装 `hardhat` 包，那么 npx 会在我们确认后，自动帮我们安装 `hardhat` 包，相当于自动执行 `npm install --save-dev hardhat` 安装命令。
    

🔻yarn

yarn 相当于将 npm 和 npx 结合了起来，即：yarn = npm + npx.

所以，不管是用到 npm 还是用到 npx 的场景，都可以用 yarn 来替代。

#### boilerplate 样板代码

boilerplate 是一段固定的代码模板，它自带了一个项目所需的框架。

项目框架以 hardhat 为例：

*   文件夹上，包括：test, scripts, node\_modules, contracts.
    
*   文件内容上，包括：.gitignore, package.json, [README.md](http://README.md) 等。
    

当我们拥有了骨架之后，我们只需要根据目的，去修改骨架当中的内容，就可以快速省去重复的开发步骤。

#### at (`@`) sign in node modules

在 `node_modules` 文件夹中，会有以 @ 符号作为开头的依赖包，如下图所示：

![@ sign in node_modules](https://storage.googleapis.com/papyrus_images/14e526ae35c51039b96711e09cdf5b1e28a253116dadfca635d7a9a1e15bff96.png)

@ sign in node\_modules

在 `package.json` 文件中，也会以 @ 符号作为开头，来声明依赖包：

![@ sign in devDependencies](https://storage.googleapis.com/papyrus_images/cde2700ae982d34af9ce8b3f654ebf01593eee254907de21c6f1e8d26ed24b5d.png)

@ sign in devDependencies

**为什么一个包要以** `@organization/package` 的形式来命名呢？

因为，这样能够增加依赖包的 namespace 命名空间，让包可以在自定义命名的同时，不用在意命名是否会与已有的包冲突。

以 `@ethersproject/abi` 为例：

*   `@ethersproject` 说明包发行方的名称是 ethersproject, 我们可以因此找到它们的 [Twitter](https://twitter.com/ethersproject), [官网](https://ethers.org/)，来了解更多的信息。
    
*   `abi` 说明包的名称是 abi，并且它的命名只需要在包发行方那里是唯一的就行，不必在整个 npm 的 registry 注册表中唯一。

---

*Originally published on [Corror](https://paragraph.com/@corror/hardhat-2022-08-27)*
