Эти цветы, создавайте проекты Vue с нуля (webpack4 Eslint git hooks...)

Webpack
Эти цветы, создавайте проекты Vue с нуля (webpack4 Eslint git hooks...)

Создайте среду разработки Vue с нуля: webpack4 + vue-loader + koa2 + babel-loader v8 + Babel v7 + eslint + git hooks + editorconfig

С 2009 по 2019 год общество постоянно совершенствуется, и технологии тоже постоянно совершенствуются.Конечно, мы не можем отставать

«Если вы не наберете маленьких шагов, вы не сможете пройти тысячу миль, а если вы не наберете маленьких ручейков, вы не сможете создать реку или море».

Сначала запустите базовую сборку веб-пакета.

Создайте vue-структуру каталога проекта

mkdir vue-structure && cd vue-structure

Установить веб-пакет

npm i webpack webpack-cli -D

Создать каталог сборки

mkdir build

В каталоге сборки создайте webpack.config.js

cd build && touch webpack.config.js

Создайте входной файл src/main.js

mkdir src

cd src && touch main.js

main.js

alert('hello world!')

настроить npm-скрипты

  // package.json 
  "scripts": {
    "build": "webpack --config build/webpack.config.js --progress --mode production"
  }

Настройка DevServer.

npm i webpack-dev-server -D

настроить npm-скрипты

  "scripts": {
    ...
    "dev": "webpack-dev-server --config build/webpack.config.js --progress --mode development"
  }

HTML-плагин

npm i html-webpack-plugin -D

конфигурация веб-пакета

// build/webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const resolve = dir => path.join(__dirname, '..', dir)

module.exports = {
  entry: resolve('src/main.js'),
  output: {
    filename: '[name].[hash:5].js',
    path: resolve('dist')
  },
  devServer: {
    host: '0.0.0.0',
    port: 7000,
    open: true
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: resolve('index.html')
    })
  ]
}

запустить сервер разработки webpack

npm run dev

Браузер открывается автоматическиhttp://0.0.0.0:7000/

Здесь служба разработки веб-пакетов в основном работает.

Настроить бабел v7

webpack 4.x | babel-loader 8.x | babel 7.x

npm i -D babel-loader @babel/core @babel/preset-env 

Плагин Бабель Поддержка динамического импорта ()

npm i @babel/plugin-syntax-dynamic-import -D

настроить webpack.config.js

  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  }

Создать файл .babelrc

{
  "plugins": [
    "@babel/plugin-syntax-dynamic-import"
  ],
  "presets": [
    [
      "@babel/preset-env",
      {
        "modules": false
      }
    ]
  ]
}

Протестируйте код ES6

test.js

  // src/test.js
  export default () => alert('hello vue!')

index.html

  // src/index.html
  <body>
    <div id="app">请说say</div>
  </body>

main.js

 // src/main.js
 document.querySelector('#app').addEventListener('click', () => {
  import('./test.js').then(res => {
    res.default()
  })
})

запустить разработчика

npm run dev

Нажмите на раздел страницы

хорошо, нет проблем

Настроить загрузчик Vue

Что такое VueLoader?

Vue Loader — это загрузчик веб-пакетов, который позволяет вам записывать компоненты Vue в формате однофайлового компонента (файл *.vue):

Создайте корневой компонент App.vue

<template>
  <div class="example">{{ msg }}</div>
</template>

<script>
export default {
  data () {
    return {
      msg: 'Hello Vue!'
    }
  }
}
</script>

<style>
.example {
  color: red;
}
</style>

Установить Вью

npm i vue

src/main.js

import Vue from 'vue'
import App from './App.vue'

new Vue({
  render: h => h(App)
}).$mount('#app')

Изменить index.html

<body>
  <div id="app"></div>
</body>

запустить разработчика

npm run dev

Результат неправильный По умолчанию webpack может распознавать только файлы JavaScript и не может анализировать файлы .vue (однофайловые компоненты vue уникальны для Vue), поэтому автор предоставляет vue-loader.

Компонент Vue с одним файлом

Talent.v ue js.org/v2/expensive/four…

Настроить vue-загрузчик

npm i vue-loader vue-template-compiler

vue-template-compiler (зависимость от одноранговых узлов) — это та же самая версия, что и vue-loader.

webpack.config.js

// webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  module: {
    rules: [
      // ... 其它规则
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  },
  plugins: [
    // 请确保引入这个插件!
    new VueLoaderPlugin()
  ]
}

CSS в однофайловом компоненте vue также нуждается в разборе css-loader

npm i css-loader -D

Конфигурация WebPack

// webpack.config.js
const VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  mode: 'development',
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      // 它会应用到普通的 `.js` 文件
      // 以及 `.vue` 文件中的 `<script>` 块
      {
        test: /\.js$/,
        loader: 'babel-loader'
      },
      // 它会应用到普通的 `.css` 文件
      // 以及 `.vue` 文件中的 `<style>` 块
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ]
      }
    ]
  },
  plugins: [
    // 请确保引入这个插件来施展魔法
    new VueLoaderPlugin()
  ]
}

На этом этапе запускается NPM Run DEV OK, и App.Vue успешно подключается к странице.

настройка препроцессора css

npm i stylus stylus-loader

webpack.config.js

module: {
    rules: [
      {
        test: /\.styl(us)?$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'stylus-loader'
        ]
      }
    ]
  }

Используется в компонентах vue

<style lang='stylus' scoped>
.example
  .title
    color: red
</style>

конфигурация postcss

postcss Предоставляет синтаксический анализатор, способный преобразовывать CSS в абстрактное синтаксическое дерево (AST).

npm i -D postcss-loader

автопрефиксер (плагин) Он может анализировать файлы CSS и добавлять префиксы браузера к содержимому CSS.

npm i -D autoprefixer

Создайте postcss.config.js

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

настроить веб-пакет

// webpack.config.js
  module: {
    rules: [
      ...
      {
        test: /\.css$/,
        use: [
          devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true
            }
          }
        ]
      },
      {
        test: /\.styl(us)?$/,
        use: [
          devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'stylus-loader',
            options: {
              sourceMap: true
            }
          }
        ]
      }
    ]
  }

Добавьте стили css3 в App.vue.

В этот момент npm run dev может видеть, что префикс браузера добавляется автоматически.

Конфигурация загрузки ресурса изображения

url-loader

Преобразовать ресурс изображения в base64 URI

// webpack.config.js

module: {
  rules: [
    {
      test: /\.(png|svg|jpe?g)$/,
      loader: 'url-loader',
      options: {
        limit: 8192
      }
    }
  ]
}

После преобразования адрес изображения становится URI base64.

file-loader

Загрузить шрифт значка

module: {
  rules: [
    {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: ['file-loader']
    }
  ]
}

cross-env

Установите переменные среды при запуске команды, чтобы различать среду в файле конфигурации веб-пакета.

npm i cross-env -D

package.json

  "scripts": {
    "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js --progress --mode production",
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.js --progress --mode development"
  },

извлечение css

webpack4

npm i mini-css-extract-plugin -D

webpack.config.js

// 区分当前环境是 development 还是 production
const devMode = process.env.NODE_ENV === 'development'

module: {
  rules: [
    {
      test: /\.css$/,
      use: [
        devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
        'css-loader'
      ]
    },
    {
      test: /\.styl(us)?$/,
      use: [
        devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
        'css-loader',
        'stylus-loader'
      ]
    }
  ]
},

plugins: [
  ...
  new MiniCssExtractPlugin({
    filename: '[name].css',
    chunkFilename: '[id].css'
  })
]

В среде разработки извлечение css обычно не включено, иначе скорость перекомпиляции будет медленной при каждом изменении кода. Обычно извлечение css включается только при упаковке в среде сборки.

На данный момент npm run build, css упаковывается отдельно в файл css.

очистить дист-каталог

Зачем нам нужно очищать каталог dist в производственной среде?Потому что наш выходной файл кэшируется, а затем имя файла сращивается с хеш-значением.Пока файл изменяется, будет сгенерировано новое хеш-значение , Выходной файл будет добавляться в каталог dist каждый раз, но нам нужно только Окончательный файл после компиляции в порядке.

npm run build трижды каталог dist выглядит следующим образом

dist
├── app.bundle.0e380cea371d050137cd.js
├── app.bundle.259c34c1603489ef3572.js
├── app.bundle.e56abf8d6e5742c78c4b.js
├── index.html
└── style.css
module.exports = {
    output: {
    filename: '[name].[hash:6].js',
    path: resolve('dist')
  },
}

Очистить с помощью плагина webpack

clean-webpack-plugin

npm i clean-webpack-plugin -D

конфигурация веб-пакета

// build/webpack.config.js

const CleanWebpackPlugin = require('clean-webpack-plugin')

module.exports = {
  plugins: [
    new CleanWebpackPlugin(['dist'], {
      root: path.join(__dirname, '../')
    })
  ]
}

Затем запустите npm run build, чтобы очистить предыдущий каталог dist перед каждой упаковкой.

Второй способ — использовать команду rimraf для очистки каталога dist.

rimraf

The UNIX command rm -rf for node.

npm i rimraf -D

Изменить package.json

"scripts": {
    "clean": "rimraf dist",
    "build": "npm run clean && cross-env NODE_ENV=production webpack --config build/webpack.config.js --progress --mode production",
}

Сборка npm run тоже в порядке

.editorconfig

Поддерживайте единый стиль кодирования для нескольких разработчиков, работающих над одним и тем же проектом в разных редакторах и IDE.

root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

editorconfig.org/

Кодовая контрольная сумма (протягивание)

установить эслинт

 npm i eslint eslint-plugin-vue -D

eslint различные инсталляции

npm i -D babel-eslint eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node

Создайте файл .eslintrc

{
  root: true,
  env: {
    node: true
  },
  parserOptions: {
    parser: "babel-eslint",
    sourceMap: "module"
  },
  extends: [
    "plugin:vue/essential",
    "standard"
  ],
  rules: {}
}

Настроить eslint в webpack

Компиляция в реальном времени через веб-пакет для проверки кода

npm i eslint-loader -D

webpack.config.js

module: {
  rules: [
    {
      {
        enforce: 'pre',
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        exclude: /node_modules/
      },
      ......
    }
  ]
}

Определите неиспользуемую переменную в src/main.js

let title = 'eslint'

запустить npm запустить dev

Базовая настройка eslint завершена, но я хочу сообщить об ошибке в консоли, чтобы быть более дружелюбным

eslint-friendly-formatter

Простой инструмент форматирования / репортер eslint, удобный для использования с расширенным текстом и функциональностью iterm2 «нажмите, чтобы открыть файл».

Установить

npm i -D eslint-friendly-formatter

Изменить конфигурацию веб-пакета

// build/webpack.config.js

module: {
  rules: [
    {
      {
        enforce: 'pre',
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        exclude: /node_modules/,
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      },
      ......
    }
  ]
}

снова npm run dev

В настоящее время информация об ошибках в командной строке более удобна, и отображаются подробные правила правил.

devServer.overlay

Ошибки компиляции отображаются прямо на странице браузера.

webpack.config.js

module.exports = {
  devServer: {
    overlay: {
      errors: true,
      warnings: true
    }
  }
}

npm снова запустите dev, чтобы увидеть сообщение об ошибке прямо на странице.

Настройте eslint в package.json

  "scripts": {
    "lint": "eslint --ext .js,.vue src"
  },

Так же есть возможность проверить код отдельно через npm

npm run lint

эслинт автофикс

Как проблемы, обнаруженные Eslint, автоматически устраняются

  "scripts": {
    "lint": "eslint --ext .js,.vue src",
    "lint:fix": "eslint --fix --ext .js,.vue src"
  },
npm run lint:fix

Он автоматически исправит некоторые общие ошибки в вашем коде.

Git Hooks

Git может запускать пользовательские сценарии при выполнении определенных важных действий. Аналогично жизненному циклу в рамках

git-triplegate.com/book/this/v2/…

husky

npm install husky --save-dev

woohoo. эта лошадь plus.com/package/nurse…

Создать .huskyrc

// .huskyrc
{
  "hooks": {
    "pre-commit": "npm run lint"
  }
}

package.json

  "scripts": {
    "lint": "eslint --ext .js,.vue src"
  },

Автоматически выполнять проверку npm run lint для каждого коммита git

разделение кода веб-пакета

Разделение кода относится к оптимизации производительности (бизнес-код, сторонний код, код среды выполнения веб-пакета...)

Вы можете настроить его прямо в webpack4

// build/webpack.config.js

module.exports = {
    optimization: {
    splitChunks: {
      // 默认将node_modules中依赖打包到venders.js
      chunks: 'all'
    },
    // 将webpack运行时生成代码打包到runtime.js
    runtimeChunk: true
  },
}

На этом этапе npm run build увидит vendors.js и runtime.js.

Дополнительные настройки опции оптимизации в webpack4 см. в официальной документации.

Веб-пакет Просто .org/config как у ATI...

Текущий полный файл конфигурации

package.json

  "scripts": {
    "clean": "rimraf dist",
    "build": "npm run clean && cross-env NODE_ENV=production webpack --config build/webpack.config.js --progress --mode production",
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.js --progress --mode development",
    "lint": "eslint --ext .js,.vue src",
    "lint:fix": "eslint --fix --ext .js,.vue src"
  },

build/webpack.config.js

const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin')

const resolve = dir => path.join(__dirname, '..', dir)

const devMode = process.env.NODE_ENV === 'development'

module.exports = {
  entry: resolve('src/main.js'),
  output: {
    filename: '[name].[hash:6].js',
    path: resolve('dist')
  },
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        exclude: /node_modules/,
        options: {
          formatter: require('eslint-friendly-formatter')
        }
      },
      {
        test: /\.vue$/,
        use: 'vue-loader',
        exclude: /node_modules/
      },
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.css$/,
        use: [
          devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true
            }
          }
        ]
      },
      {
        test: /\.styl(us)?$/,
        use: [
          devMode ? 'vue-style-loader' : MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true
            }
          },
          {
            loader: 'stylus-loader',
            options: {
              sourceMap: true
            }
          }
        ]
      },
      {
        test: /\.(png|svg|jpe?g)$/,
        loader: 'url-loader',
        options: {
          limit: 8192
        }
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        use: ['file-loader']
      }
    ]
  },
  optimization: {
    splitChunks: {
      // 默认将node_modules中依赖打包到venders.js
      chunks: 'all'
    },
    // 将webpack运行时代码打包到runtime.js
    runtimeChunk: true
  },
  devServer: {
    host: '0.0.0.0',
    port: 7000,
    open: true,
    overlay: {
      warnings: true,
      errors: true
    }
  },
  plugins: [
    new VueLoaderPlugin(),
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[id].css'
    }),
    new HtmlWebpackPlugin({
      template: resolve('index.html')
    })
    // new CleanWebpackPlugin(['dist'], {
    //   root: path.join(__dirname, '../')
    // })
  ]
}

исходный адрес конфигурации webpack

GitHub.com/ltexture1224/…

Всякий раз, когда это ночное время, это самое тихое время в сердце без отвлекающих факторов.