Vite + Svelte + Eslint(airbnb) + Prettier + Stylelint + Storybook の開発環境構築メモ
構築環境
- windows10 WSL2 Ubuntu-20.04
- node 16.13.0
- npm 8.1.0
- Vscode
機能
- Vite
- lint + format
- Prettiter
- Eslint
- airbnb
- Stylelint
- storybook
Vite app
Viteの導入
npm init vite@latest
svelte
を選択する~
npm init vite@latest
✔ Project name: … starter-vite-svelte
✔ Select a framework: › svelte
✔ Select a variant: › svelte
ディレクトリ移動とインストール
cd starter-vite-svelte
npm install
npm run dev
git 管理
git init
.editorconfigを追加
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
Prettierの導入
公式|Prettier
インストール
npm i --save-dev prettier-plugin-svelte prettier
prettierの設定
プロジェクトディレクトリ直下に.prettierrc
を作成
{
"singleQuote": true,
"trailingComma": "all"
}
npm scriptの追加
giti除外ファイルはフォーマット対象外にしておく
{
"scripts": {
"format:check": "prettier --check --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte",
"format:fix": "prettier --write --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte"
}
}
追記
json・css・jsファイルもフォーマット対象に
{
"scripts": {
"format:check": "prettier --check --ignore-path .gitignore --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}",
"format:fix": "prettier --write --ignore-path .gitignore --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}"
}
}
Eslintの導入
インストール
npm i -D eslint
自動設定
npx eslint --init
✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · none
✔ Does your project use TypeScript? · No / Yes #No
✔ Where does your code run? · browser, node
✔ How would you like to define a style for your project? · guide
✔ Which style guide do you want to follow? · airbnb
✔ What format do you want your config file to be in? · JavaScript
Checking peerDependencies of eslint-config-airbnb-base@latest
The config that you've selected requires the following dependencies:
eslint-config-airbnb-base@latest eslint@^7.32.0 || ^8.2.0 eslint-plugin-import@^2.25.2
✔ Would you like to install them now with npm? · No / Yes #Yes
Sveltev3コンポーネント用のESLintプラグインを追加
インストール
npm i -D eslint-plugin-svelte3
Eslintの設定を追加(svelte3用)
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'airbnb-base',
],
parserOptions: {
ecmaVersion: 13,
sourceType: 'module',
},
+ plugins: [
+ 'svelte3',
+ ],
rules: {
},
+ overrides: [
+ {
+ files: ['*.svelte'],
+ processor: 'svelte3/svelte3',
+ },
+ ],
};
npm scriptの追加
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"format:check": "prettier --check --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte",
"format:fix": "prettier --write --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte",
+ "lint:eslint": "eslint --ignore-path .gitignore . --ext .js,.cjs,.svelte",
+ "fix:eslint": "eslint --fix --ignore-path .gitignore . --ext .js,.cjs,.svelte"
},
自動修正
npm run fix:eslint
自動修正できない箇所は手動で直していく~
.vite.config.js のエラー修正
※eslintのルールで無効化
devDependenciesのimportを許可
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'airbnb-base',
],
parserOptions: {
ecmaVersion: 13,
sourceType: 'module',
},
plugins: [
'svelte3',
],
rules: {
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: true, // devDependenciesのimportを許可
},
],
},
overrides: [
{
files: ['*.svelte'],
processor: 'svelte3/svelte3',
rules: {
'import/no-mutable-exports': 'off',
'import/prefer-default-export': 'off',
},
},
],
};
vscodeの設定
{
"eslint.validate": [
"svelte"
]
}
Stylelintの導入
必要パッケージのインストール
https://stylelint.io/migration-guide/to-14/#syntax-option-and-automatic-inferral-of-syntax stylelint-config-recess-order
公式の指定パッケージもインストールする
npm install --save-dev stylelint stylelint-config-standard postcss-html stylelint-config-html
パッケージのインストール(プロパティ順序ルール)
npm i -D stylelint-config-recess-order
stylelintの設定を追加
.stylelintrc
を作成
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recess-order",
"stylelint-config-html"
]
}
npm scriptの追加
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"format:check": "prettier --check --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte",
"format:fix": "prettier --write --ignore-path .gitignore --plugin-search-dir=. ./**/*.svelte",
"lint:eslint": "eslint --ignore-path .gitignore . --ext .js,.svelte",
"fix:eslint": "eslint --fix --ignore-path .gitignore . --ext .js,.svelte",
+ "lint:stylelint": "stylelint --ignore-path .gitignore ./**/*.{css,svelte}",
+ "fix:stylelint": "stylelint --fix --ignore-path .gitignore ./**/*.{css,svelte}"
}
}
エラーがでるので修正していく~
チェック
npm run lint:stylelint
stylelint エラー内容
src/App.svelte
25:16 ✖ Expected newline after ":" with a multi-line declaration declaration-colon-newline-after
25:31 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
25:51 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
25:53 ✖ Expected double quotes string-quotes
25:63 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
25:71 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
26:13 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
26:24 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
26:26 ✖ Expected double quotes string-quotes
26:37 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
26:39 ✖ Expected double quotes string-quotes
26:55 ✖ Expected newline after "," in a multi-line list value-list-comma-newline-after
31:5 ✖ Expected "padding" to come before "text-align" order/properties-order
37:5 ✖ Expected "width" to come before "height" order/properties-order
43:5 ✖ Expected "font-size" to come before "text-transform" order/properties-order
46:5 ✖ Expected "margin" to come before "line-height" order/properties-order
47:5 ✖ Expected "max-width" to come before "margin" order/properties-order
src/lib/Counter.svelte
16:5 ✖ Expected "padding" to come before "font-size" order/properties-order
18:23 ✖ Expected modern color-function notation color-function-notation
18:40 ✖ Expected "0.1" to be "10%" alpha-value-notation
20:5 ✖ Expected "border" to come before "border-radius" order/properties-order
20:23 ✖ Expected modern color-function notation color-function-notation
20:40 ✖ Expected "0" to be "0%" alpha-value-notation
22:5 ✖ Expected "width" to come before "outline" order/properties-order
32:23 ✖ Expected modern color-function notation color-function-notation
32:40 ✖ Expected "0.2" to be "20%" alpha-value-notation
自動修正
npm run fix:stylelint
エラー解消w
vscodeの設定例
Example .vscode/settings.json:
{
"stylelint.validate": [
"css",
"postcss",
"svelte"
]
}
storybookの導入
インストール
npx sb init
storybook 起動|エラーで起動できない
エラー内容
ERR! Error [ERR_REQUIRE_ESM]: require() of ES Module /home/warugaki/Project/starter-kit/starter-vite-svelte/.storybook/main.js from /home/warugaki/Project/starter-kit/starter-vite-svelte/node_modules/@storybook/core-common/dist/cjs/utils/interpret-require.js not supported.
ERR! main.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which declares all .js files in that package scope as ES modules.
ERR! Instead rename main.js to end in .cjs, change the requiring code to use dynamic import() which is available in all CommonJS modules, or change "type": "module" to "type": "commonjs" in /home/warugaki/Project/starter-kit/starter-vite-svelte/package.json to treat all .js files as CommonJS (using .mjs for all ES modules instead).ERR! main.js は、最も近い親の package.json に "type" が含まれる .js ファイルであるため、ES モジュールファイルとして扱われる。そのパッケージスコープにあるすべての.jsファイルをESモジュールとして宣言する "module "が含まれている.jsファイルだからです。
ERR! 代わりに、main.jsの名前を.cjsで終わるように変更するか、すべてのCommonJSモジュールで利用可能な動的import()を使用するように必須コードを変更するか、または "type "を変更します。「モジュール" を "タイプ" に変更します。または、/home/warugaki/Project/starter-kit/starter-vite-svelte/package.json の "type": "module" を "commonjs" に変更して、すべての .js ファイルを CommonJS として扱います(代わりにすべての ES モジュールに .mjs が使用されます)。
storybookのエラーを直していく~
修正案1.
.storybook/main.js
↓
.storybook/main.cjs にリネーム以上!!
修正案2.
package.json
の "type": "module",
を削除する
storybookのサンプルを削除
storybookにコンポーネントが一つもないとおこられる~ので注意
Appコンポーネントのstorybookを作成
<script>
import { Meta, Template, Story } from '@storybook/addon-svelte-csf';
import App from '../App.svelte';
</script>
<Meta title="App" component={App}/>
<Template let:args>
<App {...args}/>
</Template>
<Story name="Default"/>
開発環境のアップデート
- VSCodeの推奨拡張機能追加
- gitignoreの更新
- storybookのビルド(除外)
- .vscodeをgit管理に
- App コンポーネントの拡張
- ソースコード管理の調整
- index.html を
src
ディレクトリに移動 - storybookのディレクトリはプロジェクトルート直下に移動
- index.html を
-
prettier
とlint
の 競合ルールの調整
eslint
インストール
npm i -D eslint-config-prettier
設定追加
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'airbnb-base',
+ 'prettier',
],
parserOptions: {
ecmaVersion: 13,
sourceType: 'module',
},
plugins: [
'svelte3',
],
rules: {
},
overrides: [
{
files: ['**/vite.config.js'],
rules: {
'import/no-extraneous-dependencies': 'off',
},
},
{
files: ['*.svelte'],
processor: 'svelte3/svelte3',
rules: {
'import/no-extraneous-dependencies': 'off',
'import/no-mutable-exports': 'off',
'import/prefer-default-export': 'off',
},
},
],
};
stylelintlint
インストール
npm i -D stylelint-config-prettier
設定追加
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recess-order",
"stylelint-config-html",
+ "stylelint-config-prettier"
]
}
- vscodeで保存時にフォーマットを実行できるように
-
prettier
のフォーマット対象とeslintの対象ファイルの追加 -
npm script
でlint & formatを並列実行できるように
インストール
npm i -D npm-run-all
npm script|prettierの名前を 他と合わせておくほうがいいと今更思う・・・なので以下のように
変更
-
"format:check"
→"lint:prettier
-
format:fix
→fix:prettier
npm scriptに lint & format の並列実行コマンドを追加していく~
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"lint:prettier": "prettier --check --ignore-path .gitignore --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}",
"fix:prettier": "prettier --write --ignore-path .gitignore --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}",
"lint:eslint": "eslint --ignore-path .gitignore . --ext .js,.cjs,.svelte",
"fix:eslint": "eslint --fix --ignore-path .gitignore . --ext .js,.cjs,.svelte",
"lint:stylelint": "stylelint --ignore-path .gitignore ./**/*.{css,svelte}",
"fix:stylelint": "stylelint --fix --ignore-path .gitignore ./**/*.{css,svelte}",
+ "lint:all": "run-s lint:eslint lint:stylelint lint:prettier",
+ "fix:all": "run-s fix:eslint fix:stylelint fix:prettier",
"stylelint-check": "stylelint-config-prettier-check",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
},
}
package-lock.jsonは prettier のフォーマット対象外にしておく
"!package-lock.json" を追加
"lint:prettier": "prettier --check --ignore-path .gitignore \"!package-lock.json\" --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}",
"fix:prettier": "prettier --write --ignore-path .gitignore \"!package-lock.json\" --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}",
コマンド実行で対象外になっているか確認
npm run fix:all
> starter-vite-svelte@0.0.0 fix:all
> run-s fix:eslint fix:stylelint fix:prettier
> starter-vite-svelte@0.0.0 fix:eslint
> eslint --fix --ignore-path .gitignore . --ext .js,.cjs,.svelte
> starter-vite-svelte@0.0.0 fix:stylelint
> stylelint --fix --ignore-path .gitignore ./**/*.{css,svelte}
> starter-vite-svelte@0.0.0 fix:prettier
> prettier --write --ignore-path .gitignore "!package-lock.json" --plugin-search-dir=. ./**/*.{json,css,js,cjs,svelte}
.eslintrc.cjs 32ms
.storybook/main.cjs 5ms
.storybook/preview.js 7ms
.vscode/extensions.json 3ms
.vscode/settings.json 4ms
jsconfig.json 8ms
package.json 4ms
src/App.svelte 105ms
src/lib/Counter.svelte 18ms
src/main.js 7ms
stories/App.stories.svelte 17ms
vite.config.js 7ms
package-lock.jsonが対象外になっているのを確認
TODO
- Jestの導入