静的サイトを作成する際、create-nuxt-app
(プロジェクト作成)後に行う環境設定を備忘録としてまとめています。
都度、更新・変更するかもです。
目次
- ESLintを追加する
- SASS(SCSS)の使用
- 共通JSの読み込み
- html/head/bodyタグの編集(サイト共通)
- ローカルサーバーのホスト・ポート番号を変更
- build設定
- 画像の保存先について
ESLintを追加する
全てのJavaScriptとVueファイルをlintします。除外したいファイルは.gitignore
に定義します。
Nuxt.jsではESLintの設定は.eslintrc.json
ではなく、.eslintrc.js
で設定します。
各種パッケージをインストール。
npm install -D babel-eslint eslint eslint-loader eslint-plugin-vue
.eslintrc.js
を作成しオプション等を設定・記述する。
module.exports = {
root: true,
env: {
browser: true,
es6: true,
node: true
},
parserOptions: {
parser: 'babel-eslint'
},
extends: [
'eslint:recommended',
'plugin:vue/recommended'
],
globals: {
"$": false,
"jQuery": false
},
// *.vueファイルをlintにかけるために必要
plugins: [
'vue'
],
rules: {
'indent': ['error', 2],
'linebreak-style': ['error', 'unix'],
'quotes': ['error', 'single'],
'semi': ['error', 'always'],
'no-console': ['warn'],
'no-unused-vars': ['warn'],
'vue/max-attributes-per-line': 'off',
'vue/singleline-html-element-content-newline': 'off'
}
};
package.json
にlint
タスクを追加します。
"scripts": {
"lint": "eslint --ext .js,.vue --ignore-path .gitignore ."
}
開発中、保存時に自動でESLintを実行するにはnuxt.config.js
に以下を追記してください。
build: {
extend(config, ctx) {
// 保存時にESLintを実行
if (ctx.isDev && ctx.isClient) {
config.module.rules.push({
enforce: "pre",
test: /\.(js|vue)$/,
loader: "eslint-loader",
exclude: /(node_modules)/
})
}
}
}
参考URL:開発ツール - NuxtJS
Sass(SCSS)の使用
必要なパッケージをインストール。
LibSass(node-sass)を使う場合
% npm install -D node-sass sass-loader
Dart Sass(sass)を使う場合
% npm install -D sass sass-loader fibers
インストール・設定後、styleタグにlang属性を追加すれば認識してくれます。
<style lang="scss">
.hoge {
&__child {
}
}
</style>
.browserslistrc
をルートディレクトリに追加
browserslistを参考にコンパイルの対象ブラウザを記述してください。
last 2 version
Firefox ESR
Chrome 28
not dead
共通SCSSを読み込み
サイト共通で読み込みたいCSSがある場合はnuxt.config.js
にパスを記述します。
export default {
css: [
{ src: '@/assets/scss/style.scss', lang: 'scss' },
]
}
SCSSをグローバル化
SCSSの変数やmixinを各コンポーネントで使用したい場合は「@nuxtjs/style-resources」をインストール。
@nuxtjs/style-resources
% npm install -D @nuxtjs/style-resources
nuxt.config.js
にモジュールと該当ファイルのパスを記述します。
export default {
modules: [
'@nuxtjs/style-resources',
],
styleResources: {
scss: [
'@/assets/scss/_var.scss',
'@/assets/scss/_mixin.scss',
]
}
}
共通JSの読み込み
- 外部リソースの読み込み
-
static
から読み込み -
plugins
から読み込み -
middleware
から読み込み - 外部リソースの読み込みについて補足
外部リソースの読み込み
外部プラグイン・CDN読み込みたい場合はこれ
-
async
:非同期 -
defer
:遅延 -
body
:</body>
の直前に追加
export default {
head: {
script: [
{ src: 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js', async: true, defer: true, body: true },
{ src: 'https://polyfill.io/v3/polyfill.min.js?version=3.52.1' },
]
}
}
参考URL:外部リソースを使うには? - NuxtJS
static
から読み込み
webpackで処理されることを意図しないファイルを読み込む場合はこれ。
外部リソースと同じ方法で読み込みます
static
フォルダに該当ファイルを追加してnuxt.config.js
にパスを記述します。
export default {
head: {
script: [
{ src: 'js/common.js', body: true }
]
}
}
plugins
から読み込み
Vueアプリケーションがが初期化される前にインポートしたい場合はこれ。
webpackで処理したい自作のJSを読み込ませる場合、この方法を利用しています。
plugin
フォルダに該当ファイルを追加してnuxt.config.js
にパスを記述します。
-
mode
:client
クライアントサイドで実行。server
サーバーサイドで実行
export default {
plugins: [
{ src: '@/plugins/common.js', mode: 'client' }
]
}
参考URL:API: plugins プロパティ - NuxtJS
middleware
から読み込み
Vueアプリケーションでルーティングが行われるタイミングで何かしたい場合はこれ。
今のところ具体的な用途がわからない。
外部リソースの読み込みについて補足
個人的な手法ですが、リソースのリクエストを減らす目的で、開発時に外部プラグインと自作JSを統合しています。
plugins
フォルダにimport
フォルダを追加し、フォルダ内に外部プラグインのソースコードなどを入れておきます。
あとは自作JSの最初に該当ファイルをimportしておけば、トランスパイルで統合されたファイルが書き出されます。
import './import/jquery.js';
import './import/slick.min..js';
外部プラグインにはESLintを動作させたくないので、動作範囲からimport
フォルダを除外します。
.eslintignore
を作成し、除外記述を追加します。
plugins/import/*
html/head/bodyタグの編集(サイト共通)
個人的に追加した要素だけ記述しています。
-
titleTemplate
:タイトルタグのテンプレート -
htmlAttrs
:htmlタグの属性指定 -
bodyAttrs
:bodyタグの属性指定
export default {
head: {
titleTemplate: '%s | SAMPLE SITE',
htmlAttrs: {
lang: 'ja',
class: ['html-class']
},
bodyAttrs: {
class: ['body-class']
}
}
}
ローカルサーバーのホスト・ポート番号を変更
ローカルIPアドレスでアクセスできるようにして、仮想環境や別デバイスで確認できるように設定します。
export default {
server: {
port: 3000,
host: '0.0.0.0'
}
}
参考URL:https://ja.nuxtjs.org/faq/host-port/
build設定
postcss
SCSSコンパイルの設定です。
-
autoprefixer
:autoprefixerでgridをIEに対応させています。
export default {
build: {
postcss: {
preset: {
autoprefixer: { grid: true }
}
}
}
}
参考URL:API: build プロパティ - NuxtJS
babel
babelの設定です。
-
targets
:ビルドのターゲットを指定します。-
server
ビルドとclient
ビルドでターゲットの初期値が異なります。server
ビルドではnode: 'current'
、client
ビルドではie: '9'
になります。 -
envTarget
では各ビルドのターゲットを定義しています。client
側に空のオブジェクトを定義しておけば.browserslistrc
の設定を参照してくれます。
-
-
useBuiltIns
:polyfillの処理方法を設定します-
usage
またはentry
を指定するとcore-js
(polyfillライブラリ)でpolyfillが補完されます。 -
usage
は必要なpolyfillだけを自動で判別してインポートしてくれます。 -
entry
は個別に手動でpolyfillをインポートします。
-
-
corejs
:core-jsの読み込みバージョンを指定します。
export default {
build: {
babel: {
presets({ envName }) {
const envTarget = {
server: { node: "current" },
client: {},
};
return [
[
require.resolve('@nuxt/babel-preset-app'),
{
targets: envTarget[envName],
useBuiltIns: "usage",
corejs: { version: 2 }
}
]
]
}
}
}
}
参考URL - 1:Babel7.x時代のpolyfillの設定方法とuseBuiltInsの仕組み
参考URL - 2:Babel7.4で非推奨になったbabel/polyfillの代替手段と設定方法
画像の保存先について
環境構築から脱線しますが、画像リソースの保存先としてassets
フォルダとstatic
フォルダの使い分けを補足しておきます。
基本的に、webpackで処理したいファイルはassets
、それ以外はstatic
で使い分けています。
assets
フォルダ
こちらに格納したファイルはデータURL(Base64)に変換、インライン化されます。
webpackで処理したいファイルはこちらに格納します。
assets
フォルダの画像参照方法
最初にエイリアスを記述するのがポイントです。
<img src="~/assets/images/image.png">
<img src="@/assets/images/image.png">
background: url("~assets/images/image.png");
background: url("~@/assets/images/image.png");
static
フォルダ
webpackで処理したくないファイルはこちらに格納します。
static
フォルダの画像参照方法
<img src="/images/image.png">
background: url("/images/image.png");
参考URL - 1:アセット - NuxtJS
参考URL - 2:【Nuxt.js】imgファイルの指定方法について