Graphite実践ガイド - Rust製2Dグラフィックエディタ
Rust言語で開発されたオープンソース2DグラフィックエディタGraphiteの使い方を徹底解説。ノードベースの編集、WebAssembly対応、プロシージャル生成など、革新的な機能を詳しく紹介します。
Biome(旧Rome)はRust製のモダンツールチェーン。ESLint・Prettierの統合代替として、実用的なパフォーマンス改善と開発体験向上を実現。導入のポイントから実際の課題まで実践的に解説します。
Biome(旧 Rome)は、JavaScript・TypeScriptエコシステムに革命をもたらす Rust製の高速ツールチェーンです。ESLint、Prettier、その他多くのツールを単一のバイナリで置き換え、開発体験を劇的に向上させます。
Biome は、Web 開発に必要な複数のツールを 1 つに統合した画期的なソリューションです:
従来の JavaScript開発環境では、複数のツールの組み合わせが必要でした:
ツール | 目的 | 設定ファイル | 実行時間 |
---|---|---|---|
ESLint | コード品質チェック | .eslintrc | 遅い |
Prettier | コードフォーマット | .prettierrc | 中程度 |
TypeScript | 型チェック | tsconfig.json | 遅い |
Biome | 全機能統合 | biome.json | 高速 |
# npmでのインストール
npm install --save-dev --save-exact @biomejs/biome
# yarnでのインストール
yarn add --dev --exact @biomejs/biome
# pnpmでのインストール
pnpm add --save-dev --save-exact @biomejs/biome
# bunでのインストール
bun add --dev --exact @biomejs/biome
# 設定ファイルの生成
npx @biomejs/biome init
生成される biome.json
の基本構成:
{
"$schema": "https://biomejs.dev/schemas/1.4.1/schema.json",
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentSize": 2
}
}
Biome のフォーマッターは、Prettierとの高い互換性を誇ります:
function HelloWorld({greeting="hello",greeted='"World"',silent=false,onMouseOver,}){
if(!greeting){return null};
// TODO: Don't use random in render
let num = Math.floor(Math.random()*1E+7).toString().replace(/.d+/ig,"");
return <div className='HelloWorld' title={`You are visitor number ${num}`} onMouseOver={onMouseOver}>
<strong>{greeting.slice(0,1).toUpperCase()+greeting.slice(1).toLowerCase()}</strong>
{greeting.endsWith(",") ? "" : <span style={{color:'grey'}}>", "</span>}
<em>{greeted}</em>
{(silent) ? "." : "!"}
</div>;
}
function HelloWorld({
greeting = "hello",
greeted = '"World"',
silent = false,
onMouseOver,
}) {
if (!greeting) {
return null;
}
// TODO: Don't use random in render
let num = Math.floor(Math.random() * 1e7)
.toString()
.replace(/.d+/gi, "");
return (
<div
className="HelloWorld"
title={`You are visitor number ${num}`}
onMouseOver={onMouseOver}
>
<strong>
{greeting.slice(0, 1).toUpperCase() + greeting.slice(1).toLowerCase()}
</strong>
{greeting.endsWith(",") ? (
""
) : (
<span style={{ color: "grey" }}>", "</span>
)}
<em>{greeted}</em>
{silent ? "." : "!"}
</div>
);
}
function HelloWorld({greeting="hello",greeted='"World"',silent=false,onMouseOver,}){
if(!greeting){return null};
// TODO: Don't use random in render
let num = Math.floor(Math.random()*1E+7).toString().replace(/.d+/ig,"");
return <div className='HelloWorld' title={`You are visitor number ${num}`} onMouseOver={onMouseOver}>
<strong>{greeting.slice(0,1).toUpperCase()+greeting.slice(1).toLowerCase()}</strong>
{greeting.endsWith(",") ? "" : <span style={{color:'grey'}}>", "</span>}
<em>{greeted}</em>
{(silent) ? "." : "!"}
</div>;
}
function HelloWorld({
greeting = "hello",
greeted = '"World"',
silent = false,
onMouseOver,
}) {
if (!greeting) {
return null;
}
// TODO: Don't use random in render
let num = Math.floor(Math.random() * 1e7)
.toString()
.replace(/.d+/gi, "");
return (
<div
className="HelloWorld"
title={`You are visitor number ${num}`}
onMouseOver={onMouseOver}
>
<strong>
{greeting.slice(0, 1).toUpperCase() + greeting.slice(1).toLowerCase()}
</strong>
{greeting.endsWith(",") ? (
""
) : (
<span style={{ color: "grey" }}>", "</span>
)}
<em>{greeted}</em>
{silent ? "." : "!"}
</div>
);
}
Biome は 325 以上のルールを提供し、詳細な診断情報を表示します:
# リント実行
npx @biomejs/biome lint ./src
# 自動修正可能な問題を修正
npx @biomejs/biome lint --write ./src
# フォーマット、リント、インポート整理を一括実行
npx @biomejs/biome check --write ./src
{
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"complexity": {
"noBannedTypes": "error",
"noUselessTypeConstraint": "error"
},
"correctness": {
"noUnusedVariables": "error",
"useExhaustiveDependencies": "warn"
},
"style": {
"noNonNullAssertion": "off",
"useImportType": "error"
}
}
}
}
{
"files": {
"ignore": [
"node_modules",
"dist",
"coverage",
"*.min.js"
]
},
"formatter": {
"ignore": [
"public/vendor/**"
]
}
}
プロジェクトにBiomeを追加
biome.jsonで既存ルールを再現
package.jsonのスクリプトを変更
ESLint・Prettierを段階的に削除
{
"scripts": {
"lint": "eslint src --ext .js,.ts,.tsx",
"lint:fix": "eslint src --ext .js,.ts,.tsx --fix",
"format": "prettier --write src/**/*.{js,ts,tsx}",
"format:check": "prettier --check src/**/*.{js,ts,tsx}"
}
}
{
"scripts": {
"lint": "biome lint ./src",
"lint:fix": "biome lint --write ./src",
"format": "biome format --write ./src",
"format:check": "biome format ./src",
"check": "biome check --write ./src"
}
}
{
"scripts": {
"lint": "eslint src --ext .js,.ts,.tsx",
"lint:fix": "eslint src --ext .js,.ts,.tsx --fix",
"format": "prettier --write src/**/*.{js,ts,tsx}",
"format:check": "prettier --check src/**/*.{js,ts,tsx}"
}
}
{
"scripts": {
"lint": "biome lint ./src",
"lint:fix": "biome lint --write ./src",
"format": "biome format --write ./src",
"format:check": "biome format ./src",
"check": "biome check --write ./src"
}
}
Biome の圧倒的な高速性を示すデータ:
Intel Core i7 1270P で 171,127 行のコード(2,104 ファイル)をフォーマットした場合、Biome は Prettierより約 35 倍高速に動作します。
# 10万行規模のプロジェクトでの実測値
# Prettier: 8.2秒
# Biome: 0.23秒(約35倍高速)
time npx prettier --write src/
time npx biome format --write src/
name: Code Quality
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npx @biomejs/biome ci
# huskyのインストール
npm install --save-dev husky lint-staged
# .huskyrc設定
echo 'npx lint-staged' > .husky/pre-commit
package.json
に追加:
{
"lint-staged": {
"*.{js,ts,tsx,json}": [
"biome check --write --no-errors-on-unmatched"
]
}
}
{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
}
}
{
"extends": ["@company/biome-config"],
"files": {
"include": ["packages/*/src/**/*"]
},
"overrides": [
{
"include": ["packages/ui/**/*"],
"linter": {
"rules": {
"style": {
"noImplicitBoolean": "off"
}
}
}
}
]
}
{
"linter": {
"rules": {
"suspicious": {
"noExplicitAny": "error",
"noArrayIndexKey": "warn"
},
"nursery": {
"useSortedClasses": "error"
}
}
}
}
{
"files": {
"maxSize": 1048576,
"ignore": [
"**/*.min.js",
"**/vendor/**",
"**/node_modules/**"
]
}
}
Biome の開発チームは以下の機能追加を計画しています:
Biome は、JavaScript・TypeScript開発の複雑さを解消する革命的なツールです:
開発チームの生産性向上と、コード品質の向上を同時に実現する Biome を、ぜひ次のプロジェクトで試してみてください。