開発と本番でコードを分ける

Nuxt.js
公開日:
更新日:

process.env.NODE_ENV で分岐すると、開発時のみ必要なコードを仕込むことができます。

if (process.env.NODE_ENV !== 'production') {
  // 開発時のみ必要なコード
} else {
  // 本番用コード
}

例えば、Nuxt.js で開発時は API からデータを取ってきて、nuxt generate 時は payload をそのまま data に流し込みたいなら、以下のように書けます。

$api はプラグインから inject したものです。

<script>
let asyncData = null

if (process.env.NODE_ENV !== 'production') {
  asyncData = async ({ $api }) => {
    const {
      'data':
        'contents': posts
      }
    } = await $api.get('posts')
    return { posts }
  }
} else {
  asyncData = ({ payload }) => payload
}

export default {
  asyncData,
}
</script>

また、require() したモジュールなども丸ごとバンドルされなくなるので、開発時のみ必要なモジュールは if (process.env.NODE_ENV !== 'production') 内でインポートすれば、ビルド時のスクリプトサイズを大幅に減らすことができます。

if (process.env.NODE_ENV !== 'production') {
  const hljs = require('highlight.js/lib/core')
  hljs.registerLanguage('xml'require('highlight.js/lib/languages/xml'))
  hljs.registerLanguage('scss'require('highlight.js/lib/languages/scss'))
  hljs.registerLanguage('javascript'require('highlight.js/lib/languages/javascript'))
  hljs.registerLanguage('shell'require('highlight.js/lib/languages/shell'))
  hljs.registerLanguage('bash'require('highlight.js/lib/languages/bash'))
  hljs.registerLanguage('ini'require('highlight.js/lib/languages/ini'))
  hljs.registerAliases('css', { languageName'scss' })

  const { decodeHTML } = require('entities')

  asyncData = async ({ $api, params }) => {
    const { 'data': post } = $api.get(`posts/${params.id}`)
    post.content = post.content.replace(/<pre><code>(.+?)<\/code><\/pre>/gims, (match, p1) => {
      const { language, value } = hljs.highlightAuto(decodeHTML(p1))
      const langClass = language ? ` lang-${language}` : ''
      return `<pre><code class="hljs${langClass}">${value}</code></pre>`
    })
  }
} else {
  asyncData = ({ payload }) => payload
}