「プロジェクトが始まったばかりでまだ開発環境が準備できていないけど、とりあえず仮でコーディングしたWebページを他の人と共有したい」「コーディング作業中、自動でSCSSコンパイル・ベンダープレフィックス自動付与・CSS圧縮は行いたい(Preprosなどのコンパイラ、Gulpなどのタスクランナーは導入したくない)」などの時に、npm(yarn) scriptsを使って静的サイトの開発環境を作った時の覚え書きです。
とても参考になったこちらの記事を、自分の必要な部分のみ抜き出し・編集、あとで自分で読み返した時に問題なくできるように、初歩的な動作などを追記したものになります。
参考元の記事にはJavaScriptや画像の圧縮、ファイル構成などの説明などがとても丁寧に行われているので、フル機能が欲しい方やきちんとした説明を知りたい方はそちらを参考にしたほうがよいです!
(私も必要になったタイミングで導入しようと思っています)(この記事に追記しているかもしれません)
yarn
とnpm
、どちらでも出来るようにそれぞれのコマンドを書いています。
私自身業務ではyarnを使ってるものの、プライベートで両方使っている・今後どちらを使うかはまだ迷い中なので…
前提条件・バージョン
-
以下の操作ができること
- Git/GitHub
- ターミナル
- npm もしくは yarn
- SCSS
-
バージョン
- node.js v12.11.1
- npm 6.12.1
- yarn 1.19.1
開発環境の構築
作業ディレクトリの作成
ターミナルを起動し、開発用ワークスペースから作業ディレクトリを作成します。
# 開発用ワークスペースに移動(適量書き換えてください)
cd /Users/(ユーザ名)/workspace
# 「starter-kit」ディレクトリ作成
mkdir starter-kit
# starter-kit内に移動
cd starter-kit
Git導入
作業ディレクトリでGitが使えるように設定します。
git init
をターミナルで実行後、
Initialized empty Git repository in /(workspace-dir)/.git/
というメッセージが出て、ディレクトリ内に「.git」というフォルダができていれば成功です。
.gitignore設定
Gitで監視から外すファイル・ディレクトリを指定する、 .gitignore
もコミット前に作っておきます。
これを作っておかないと、勝手に生成される膨大なファイルがGit内に紛れ込んできて、少しファイル操作するたびに更新ファイル数がとんでもないことになります… 慣れてない頃はよくやらかして、キャッシュをクリアしていました…
毎回.gitignoreを追加するのが手間なので、下記の方法でグローバルから一括適用させると楽です。
ですが、グローバル設定をしていなかった時の為に、GitHub公式アカウント > gitignoreリポジトリ > Node.gitignoreの内容をコピペし、適量調整したものを.gitignoreとしてディレクトリ内に置きました。
package.json作成
ターミナルから、インストールしたパッケージを管理するためのファイル、package.json
を作成します。
ターミナルからコマンド入力で簡単に作れますが、作成時の質問が面倒なので-y
オプションで飛ばしてしまいます(初期値が入力されます)
# npm
npm init -y
# yarn
yarn init -y
実行後、こんなメッセージが出て、ディレクトリの中に「package.json」というファイルができていれば成功です。
npm:
Wrote to /(workspace-dir)/package.json:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": { "test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}yarn:
yarn init v1.19.1 warning The yes flag has been set. This will automatically answer yes to all questions, which may have security implications.
success Saved package.json
✨ Done in 0.08s
環境によっては差異があるかもしれません…
SCSS変換
SCSSからCSSにファイル変換するためのパッケージを、node-sassターミナルからインストールします。
今回のような、開発時にのみ必要(アプリケーション自体の実行には必要がない)なパッケージは--save-dev
で開発時にだけ使うパッケージとしてインストールします。
# npm
npm install node-sass --save-dev
# yarn
yarn add node-sass --dev
package.json
をエディタで開き、実行コマンドを指定します。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css"
},
もし"scripts:"
自体がなければ追加してください。
ディレクトリ内に下記ディレクトリとファイルをそれぞれ作成します。
src/assets/scss
ディレクトリ-
src/assets/scss/style.scss
ファイル- コンパイルの動作確認のために簡単にSCSSを記述しておくと良い
dist/assets/css
ディレクトリ
ターミナルから以下を実行します。
# npm
npm run css/scss
# yarn
yarn run css/scss
さきほど作ったdist/assets/css
内に、style.css.map
とstyle.css
が生成されていれば成功です。
Rendering Complete, saving .css file... Wrote Source Map to /(workspace-dir)/dist/assets/css/style.css.map Wrote CSS to /(workspace-dir)/dist/assets/css/style.css
CSS圧縮+ベンダープレフィックス自動付与
SCSSからCSSにコンパイルできましたが、ベンダープレフィックスをつけてくれるautoprefixや、ファイル圧縮などの機能はついていません。 せっかくなら一緒に行いたいのでそのためのパッケージ、autoprefixer、、cssnano、postcss-cliをインストールしていきます。
ターミナルから以下を実行、
# npm
npm install postcss-cli cssnano autoprefixer --dave-dev
# yarn
yarn add postcss-cli cssnano autoprefixer --dev
package.json
をエディタで開き、実行コマンドを指定します。
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css"
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css"
},
このままnpm run css/postcss
またはyarn run css/postcss
を実行してしまうと、ターミナル実行時に「PostCSSの設定がまだ終わっていないよ」というエラーが出てしまいます。
Replace Autoprefixer browsers option to Browserslist config. Use browserslist key in package.json or .browserslistrc file.
Using browsers option cause some error. Browserslist config can be used for Babel, Autoprefixer, postcss-normalize and other tools.
If you really need to use option, rename it to overrideBrowserslist.
Learn more at: https://github.com/browserslist/browserslist#readme https://twitter.com/browserslist
ディレクトリ直下にpostcss.config.js
というファイルを作り、以下をそのままコピペします。
module.exports = {
plugins: [
require('autoprefixer')({
browsers: ['last 2 versions'],
cascade: false
}),
require('cssnano')({
preset: 'default',
})
]
}
もう一度npm run css/postcss
またはyarn run css/postcss
すると、処理が完了します。
もしここでエラーが起きたら
Replace Autoprefixer browsers option to Browserslist config. Use browserslist key in package.json or .browserslistrc file.
Using browsers option cause some error. Browserslist config can be used for Babel, Autoprefixer, postcss-normalize and other tools.
If you really need to use option, rename it to overrideBrowserslist.
Learn more at: https://github.com/browserslist/browserslist#readme https://twitter.com/browserslist
npm run css/postcss
またはyarn run css/postcss
のあとに、このようなエラーが表示されたら、postcss.config.js
のrequire('autoprefixer'){}
表記をpackage.json
に移動する必要があります。
postcss.config.js
を開き、下のコメントアウト部分を全部消します。
module.exports = {
plugins: [
// require('autoprefixer')({
// browsers: ['last 2 versions'],
// cascade: false
// }),
require('cssnano')({
preset: 'default',
})
]
}
package.json
を開いて、autoprefixer設定を足します。
{
"devDependencies": {
"autoprefixer": "^9.7.1",
"cssnano": "^4.1.10",
"node-sass": "^4.13.0",
"postcss-cli": "^6.1.3"
},
"browserslist": [
"last 2 version"
]
}
もう一度npm run css/postcss
またはyarn run css/postcss
を実行してみてください。
ゴミファイル掃除
ファイルを作成、名前を変更中にコンパイルが実行され、変更前の名前のファイル、変更後の名前のファイルの両方が生成されてしまったり、気づかないうちに不要なファイルが量産されてしまうことがあります。
一連の処理を走らせる前にコンパイルで生成されたファイルを全部削除してから、ファイルを生成しなおすという処理を追加します。
package.json
をエディタで開き、実行コマンドを指定します。
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css"
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css"
},
npm run clean/css
またはyarn run clean/css
を実行すると、
一連のSCSS変換処理をまとめて実行する
いったん、これまで作ったSCSSまわりの処理を1つにまとめます。 ひとつひとつ実行するのは骨が折れるので…
# npm
npm install npm-run-all --save-dev
# yarn
yarn add npm-run-all --dev
package.json
をエディタで開き、実行コマンドを指定します。
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css"
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css",
"css": "npm run clean/css && npm-run-all -p css/*"
},
ターミナルから以下を実行します。
# npm
npm run css
# yarn
yarn run css
先ほど作った処理が一括で行なえます。便利!
HTML監視
ブラウザに表示させるためのHTMLファイルを作成します。
src/assets/html/index.html
を作り、必要最低限な中身を作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document Title</title>
</head>
<body>
<h1>Document Title</h1>
</body>
</html>
ターミナルから以下を実行、
# npm
npm install watch cpx --save-dev
# yarn
yarn add watch cpx --dev
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css",
"css": "npm run clean/css && npm-run-all -p css/*"
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css",
"css": "npm run clean/css && npm-run-all -p css/*",
"html/plain": "cpx 'src/assets/html/**/*.html' 'dist/'",
"html": "npm-run-all html/*",
},
ターミナルから以下を実行します。
# npm
npm run html
# yarn
yarn run html
src
内にあったhtmlファイルが、dist
にも表示されるようになりました!
ファイルを監視、更新があるたびに処理を行ってブラウザリロードまで行う
HTMLやSCSSファイルを変更するたびに、ターミナルにいちいちnpm(yarn) run html
やnpm(yarn) run css
をするのはとても大変です。
ファイルに変更があるたびに、自動で処理を行ってくれる処理をwatch
で作ります。
ついでに、更新があったらブラウザも再読み込みするようにbrowser-sync
で設定してしまいます。
ターミナルから以下を実行、
# npm
npm install watch browser-sync --save-dev
# yarn
yarn add watch browser-sync --dev
package.json
をエディタで開き、実行コマンドを指定します。
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css",
"css": "npm run clean/css && npm-run-all -p css/*",
"html/plain": "cpx 'src/assets/html/**/*.html' 'dist/'",
"html": "npm-run-all html/*",
},
↓
"scripts": {
"css/scss": "node-sass src/assets/scss/style.scss -o dist/assets/css --output-style expanded --source-map dist/assets/css",
"css/postcss": "postcss dist/assets/css/style.css -o dist/assets/css/style.min.css",
"clean/css": "rimraf dist/assets/css && mkdir -p dist/assets/css",
"css": "npm run clean/css && npm-run-all -p css/*",
"html/plain": "cpx 'src/assets/html/**/*.html' 'dist/'",
"html": "npm-run-all html/*",
"watch/server": "browser-sync start -s dist -f 'src, **/*.html, !node_modules/**/*'",
"watch/css": "watch 'npm run css' ./src/assets/scss",
"watch": "npm-run-all -p watch/*"
},
ターミナルから以下を実行します。
# npm
npm run watch
# yarn
yarn run watch
これまで書いたすべての処理をwatch
で行うようにしているので、作ったページがlocalhostのURLで表示されたら成功です!
[Browsersync] Access URLs:
Local: http://localhost:3000 External: http://XX.XX.XXX.XXX:3000
UI: http://localhost:3001
UI External: http://localhost:3001
おわりに
GitHubにこれまで作った一式をアップロードしました。 (URL)
git clone (リポジトリURL)
をしたあとにyarn run watch
を実行するとサイトが表示されると思います!