npm scriptsでBrowsersyncによるローカルサーバーを起動する(bs-config.js、SSI)
要件
- htdocsディレクトリを対象にローカルサーバーを起動する
- SSIにも対応可能にする
パッケージをインストールする
Browsersyncのパッケージをインストールします。
npm i -D browser-sync
SSI対応が必要な場合はbrowsersync-ssi
も追加でインストールします。
npm i -D browsersync-ssi
クロスプラットフォームに対応して簡潔に記述できるnpm-run-allとファイルの監視機能があるonchangeもインストールします。
npm i -D npm-run-all onchange
ディレクトリ構造
以下のディレクトリ構造で構成しています。
.
├── bs-config.js
└── htdocs
-
bs-config.js
:Browsersyncの設定ファイル
bs-config.jsを作成する
npx browser-sync init
を実行するとbs-config.js
が作成されます。
/*
|--------------------------------------------------------------------------
| Browser-sync config file
|--------------------------------------------------------------------------
|
| For up-to-date information about the options:
| http://www.browsersync.io/docs/options/
|
| There are more options than you see here, these are just the ones that are
| set internally. See the website for more info.
|
|
*/
module.exports = {
"ui": {
"port": 3001
},
"files": false,
"watchEvents": [
"change"
],
"watch": false,
"ignore": [],
"single": false,
"watchOptions": {
"ignoreInitial": true
},
"server": false,
"proxy": false,
"port": 3000,
"middleware": false,
"serveStatic": [],
"ghostMode": {
"clicks": true,
"scroll": true,
"location": true,
"forms": {
"submit": true,
"inputs": true,
"toggles": true
}
},
"logLevel": "info",
"logPrefix": "Browsersync",
"logConnections": false,
"logFileChanges": true,
"logSnippet": true,
"rewriteRules": [],
"open": "local",
"browser": "default",
"cors": false,
"xip": false,
"hostnameSuffix": false,
"reloadOnRestart": false,
"notify": true,
"scrollProportionally": true,
"scrollThrottle": 0,
"scrollRestoreTechnique": "window.name",
"scrollElements": [],
"scrollElementMapping": [],
"reloadDelay": 0,
"reloadDebounce": 500,
"reloadThrottle": 0,
"plugins": [],
"injectChanges": true,
"startPath": null,
"minify": true,
"host": null,
"localOnly": false,
"codeSync": true,
"timestamps": true,
"clientEvents": [
"scroll",
"scroll:element",
"input:text",
"input:toggles",
"form:submit",
"form:reset",
"click"
],
"socket": {
"socketIoOptions": {
"log": false
},
"socketIoClientConfig": {
"reconnectionAttempts": 50
},
"path": "/browser-sync/socket.io",
"clientPath": "/browser-sync",
"namespace": "/browser-sync",
"clients": {
"heartbeatTimeout": 5000
}
},
"tagNames": {
"less": "link",
"scss": "link",
"css": "link",
"jpg": "img",
"jpeg": "img",
"png": "img",
"svg": "img",
"gif": "img",
"js": "script"
},
"injectNotification": false
};
必要に応じて、このファイルを変更していきます。
変更しない設定は削除してしまって問題ないようです。
よく使いそうな設定を説明します。
files
監視対象にするファイルやディレクトリを設定します。
変更されたら自動的にリロードされます。
"files": false,
次のようにglobで指定したり、["app/css/style.css", "app/js/*.js"]
のように配列での指定も可能です。
"files": [
"htdocs/**/*.{html,css,js}",
],
server
監視対象のディレクトリを設定します。
"server": false,
ディレクトリを1つ設定するだけOKです。
"server": "htdocs",
proxy
プロキシを設定します。
仮想環境のIP("localhost:8080"
など)を設定するとBrowsersyncの機能が使えるようです。
"proxy": false,
port
ポート番号を設定します。
同じ値のポートがすでに開いている場合は、自動的に別の番号で開いてくれます。
"port": 3000,
open
ローカルサーバーを自動的に開くかどうか、開く場合の方法を設定します。
"open": "local",
-
false
:自動で開かない(ログに表示されるURLから開く) -
"local"
:localhost
で開く -
"external"
:IPアドレスで開く
notify
ファイル更新時に表示される「Browsersync: connected」というポップオーバーの表示を切り替えます。
"notify": true,
-
true
:ポップオーバーを有効にする -
false
:ポップオーバーを無効にする
startPath
ブラウザで開いたときのパスを設定します。
"startPath": null,
たとえば"/styleguide/"
のように指定します。
SSIを設定する
SSIを使用する場合は、「browsersync-ssi」を使用します(似たライブラリに「connect-ssi」がありますが、大きくは違いがなさそう?)。
bs-config.jsにbrowsersync-ssiをrequireします。
const ssi = require('browsersync-ssi')
middlewareの初期値は"middleware": false,
となっていますが、次のように変更します。
"middleware": ssi({
baseDir: 'htdocs',
ext: '.html',
}),
-
baseDir
:server
と同じ値 -
ext
:SSIを実行するファイルの拡張子(デフォルトは.shtml
)
npm scriptsを設定する
Browsersyncに関連する処理だけを抜き出しています。
"start": "run-s -c dev watch",
"watch": "run-p watch:*",
"watch:css": "onchange \"src/**/*.scss\" -- npm run dev:css",
"watch:js": "onchange \"src/**/*.js\" -- npm run dev:js",
"watch:serve": "browser-sync start --config \"./bs-config.js\"",
"dev": "run-p dev:*",
-
dev
は開発用のビルドとしています -
run-s
は順番に実行、-c
はエラーが起きても最後の処理まで止まらずに実行するオプションです -
browser-sync start
以降がオプション指定、--config
オプションでbs-config.js
を設定ファイルとして指定します(bs-config.js
よりもコマンドラインが優先されるので注意) - Browsersyncは
htdocs
内の指定ファイルが変更されたら自動更新されるので、watch:serve
が実行され停止されない状態であればOK(watch
にwatch:serve
を含めているのは流れを分かりやすくするため) - 開発用のコマンドである
start
でdev
コマンドがすべて実行されたら、watch
コマンドが次に実行される
Discussion