Рукописная конфигурация webpack4.0

Командная строка JavaScript CSS Webpack
Рукописная конфигурация webpack4.0

После подтверждения ваших глаз вы все еще не готовы к осенним рекрутам? ограниченный срок. Поскольку Jingdong начал набор стажеров для руководителей 8 июня, это означает начало осеннего набора. А вы все еще ждете прихода осени? В этом году ситуация должна быть более жесткой, поскольку экосистема основных технологий (vue, webpack, react, апплет WeChat) становится все более зрелой, это также означает, что нам нужно глубже их понимать и осваивать. Например, если вы пишете проект vue, вы знаете vue-cli. Написанные проекты также не имеют себе равных, но пойдете ли вы разбираться, что случилось с vue-cli? Возможно, интервьюер хочет задать вам этот вопрос: пожалуйста, напишите конфигурацию webpack4.0.

предисловие

Возможности всегда зарезервированы для тех, кто готов.Если вы хотите преуспеть в этом хаотичном сезоне поиска работы, вы можете выиграть долгожданное предложение. Тогда вам следует знать много такого, чего не знают другие, чтобы ваши крылья были полны и вы могли парить в небе. Орлы поражают небо не по своей природе, а из-за опасности скал, когда они были молодыми. Глупые птицы летят первыми, полагаясь не на мудрость, а на неустанные усилия.

Подробное объяснение веб-пакета

webpack — это инструмент для упаковки, его цель — упаковать все статические ресурсы. Некоторые люди спросят, почему webpack? Webpack является краеугольным камнем современных интерфейсных технологий, а традиционные методы разработки, такие как jquery, html и css, статическая веб-разработка отстают. Это эпоха MVVM, интерфейсов, управляемых данными. Webpack содержит множество новых и полезных технологий для современной разработки js. Описание веб-пакета подавляющее, я не буду тратить время. Изучите изображение ниже, чтобы узнать об экосистеме веб-пакета:

webpack

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

const path = require('path');  //引入node的path模块
const webpack = require('webpack'); //引入的webpack,使用lodash
const HtmlWebpackPlugin = require('html-webpack-plugin')  //将html打包
const ExtractTextPlugin = require('extract-text-webpack-plugin')     //打包的css拆分,将一部分抽离出来  
const CopyWebpackPlugin = require('copy-webpack-plugin')
// console.log(path.resolve(__dirname,'dist')); //物理地址拼接
module.exports = {
    entry: './src/index.js', //入口文件  在vue-cli main.js
    output: {       //webpack如何输出
        path: path.resolve(__dirname, 'dist'), //定位,输出文件的目标路径
        filename: '[name].js'
    },
    module: {       //模块的相关配置
        rules: [     //根据文件的后缀提供一个loader,解析规则
            {
                test: /\.js$/,  //es6 => es5 
                include: [
                    path.resolve(__dirname, 'src')
                ],
                // exclude:[], 不匹配选项(优先级高于test和include)
                use: 'babel-loader'
            },
            {
                test: /\.less$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: [
                    'css-loader',
                    'less-loader'
                    ]
                })
            },
            {       //图片loader
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'file-loader' //根据文件地址加载文件
                    }
                ]
            }
        ]                  
    },
    resolve: { //解析模块的可选项  
        // modules: [ ]//模块的查找目录 配置其他的css等文件
        extensions: [".js", ".json", ".jsx",".less", ".css"],  //用到文件的扩展名
        alias: { //模快别名列表
            utils: path.resolve(__dirname,'src/utils')
        }
    },
    plugins: [  //插进的引用, 压缩,分离美化
        new ExtractTextPlugin('[name].css'),  //[name] 默认  也可以自定义name  声明使用
        new HtmlWebpackPlugin({  //将模板的头部和尾部添加css和js模板,dist 目录发布到服务器上,项目包。可以直接上线
            file: 'index.html', //打造单页面运用 最后运行的不是这个
            template: 'src/index.html'  //vue-cli放在跟目录下
        }),
        new CopyWebpackPlugin([  //src下其他的文件直接复制到dist目录下
            { from:'src/assets/favicon.ico',to: 'favicon.ico' }
        ]),
        new webpack.ProvidePlugin({  //引用框架 jquery  lodash工具库是很多组件会复用的,省去了import
            '_': 'lodash'  //引用webpack
        })
    ],
    devServer: {  //服务于webpack-dev-server  内部封装了一个express 
        port: '8080',
        before(app) {
            app.get('/api/test.json', (req, res) => {
                res.json({
                    code: 200,
                    message: 'Hello World'
                })
            })
        }
    }
    
}

Во-первых, создание внешней среды

Используем npm или yarn для установки webpack

npm install webpack webpack-cli -g 
# 或者 
yarn global add webpack webpack-cli

ЗачемwebpackБудет ли он разделен на два файла? В веб-пакете 3 сам веб-пакет и его кли были в одном пакете, но в версии 4 они были разделены, чтобы лучше управлять ими.

Создайте новую папку webpack, создайте в ней новый try-webpack (чтобы имя проекта и установочный пакет не совпадали во время инициализации), а затем инициализируйте и настройте webpack.

 npm init -y  //-y 默认所有的配置
 yarn add webpack webpack-cli -D  //-D webpack安装在devDependencies环境中

2. Разверните веб-пакет

В проекте среды, созданном выше, мы переходим к package.json, чтобы настроить наши скрипты и позволить веб-пакету

  "scripts": {
    "build": "webpack --mode production" //我们在这里配置,就可以使用npm run build 启动我们的webpack
  },
  "devDependencies": {
    "webpack": "^4.16.0",
    "webpack-cli": "^3.0.8"
  }

После настройки рабочей среды нашего веб-пакета подумайте о vue-cli. Обычно использование vue-cli автоматически помогает нам настраивать и создавать проекты. Мы разрабатываем проект под src, и, наконец, npm запускаем пакеты сборки и создаем наш каталог dist. Я не знаю, помните ли вы еще, давайте перейдем к следующему разделу и давайте прочувствуем весь процесс.

3. Что случилось со сборкой npm run

Создайте новый каталог src в try-webpack под нашим корневым проектом. Создайте новый файл index.js в каталоге src. В нем мы можем написать произвольный код, ориентируясь на случай:

const a = 1;

После написания запускаем в терминале нашу команду npm run build, вы обнаружите, что добавилась новая директория dist, в которой хранится упакованный webpack файл main.js. Это то же самое, что мы делаем в vue-cli.

В-четвертых, статьи о процессе настройки webpackp

Какие файлы мы обычно упаковываем в src при разработке? Можно вспомнить, что на самом деле src проекта vue-cli — это не просто следующие пункты:

  • html, css, js обязательны при публикации
  • css прекомпилятор стилус, меньше, sass
  • Расширенный синтаксис для es6
  • Ресурсы изображений .png, .gif, .ico, .jpg
  • требовать между файлами
  • Модификаторы, такие как псевдоним @

Затем я объясню настройку webpack.config.js в webpack в этих пунктах и ​​следую шагам, чтобы шаг за шагом выполнить нашу технологическую линию.

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

Создайте новый файл webpack.config.js в корневом каталоге проекта try-webpack, экспортируйте его с помощью модульного механизма commonJS и создайте новый index.html.

module.exports = {}

Настройте нашу входную запись, которая эквивалентна main.js в том же каталоге в vue-cli, наш экспортный вывод. Мы можем понимать webpack как фабрику.Ввод эквивалентен закладке различного сырья на нашу фабрику, а затем фабрика выполняет ряд упаковочных операций для экспорта упакованных вещей, а затем их можно продать (онлайн).

const path = require('path'); //引入我们的node模块里的path
//测试下 console.log(path.resolve(__dirname,'dist')); //物理地址拼接
module.exports = {
    entry: './src/index.js', //入口文件  在vue-cli main.js
    output: {       //webpack如何向外输出
        path: path.resolve(__dirname, 'dist'),//定位,输出文件的目标路径
        filename: '[name].js' //文件名[name].js默认,也可自行配置
    },

HTML-упаковку нам нужно установить и внедрить html-webpack-plugin

yarn add html-webpack-plugin -D //在开发环境中安装
const HtmlWebpackPlugin = require('html-webpack-plugin')  //引入打包我们的HTML

Настраиваем наши плагины (плагины) в module.exports:

 plugins: [  //插进的引用, 压缩,分离美化
        new HtmlWebpackPlugin({  //将模板的头部和尾部添加css和js模板,dist 目录发布到服务器上,项目包。可以直接上线
            file: 'index.html', //打造单页面运用 最后运行的不是这个
            template: 'src/index.html'  //vue-cli放在跟目录下
        }),
    ],

После настройки, после ввода npm run dev в терминале, webpack упакует наш html и автоматически импортирует наш js.

<body>
    <p class="main">Hello World</p>
<script type="text/javascript" src="main.js"></script>
</body>

Разделите наш каталог dist, запустите порт 8080, и мы сможем увидеть наш Hello World. Это наша онлайн-версия страницы.

🍉настройка css в webpack

В нашем vue-cli мы можем использовать css для написания наших стилей, или мы можем использовать расширенный стилус, less, sass и другие прекомпиляторы. Давайте возьмем less в качестве примера, чтобы увидеть, как webpack упаковывает его в css.

.main {
  color: red;
}

Создайте наш файл style.less в каталоге src.Перед настройкой нам нужно npm наш css-загрузчик и sass-загрузчик, sass

yarn add css-loader less less-loader style-loader -D

После выполнения вышеуказанной команды мы можем увидеть наш файл конфигурации в package.json.

 "devDependencies": {
    "css-loader": "^1.0.0",
    "html-webpack-plugin": "^3.2.0",
    "sass": "^1.9.0",
    "sass-loader": "^7.0.3",
    "webpack": "^4.16.0",
    "webpack-cli": "^3.0.8"
  }

После установки мы начинаем настраивать файл webpack.config.js. Здесь указано, что наш css должен быть отделен от нашего HTML в каталоге dist, который должен представить наш плагин extract-text-webpack-plugin, сначала мы устанавливаем его

yarn add extract-text-webpack-plugin -D

Тут есть ямка, extract-text-webpack-plugin не поддерживает такую ​​установку в 4.0, можно самому хромировать. Значит выбираем другой путь, выбираем версию 4.00-beta.0

yarn add extract-text-webpack-plugin@last -D

Заходите к нам в module.exports и завершите настройку моделя

const ExtractTextPlugin = require('extract-text-webpack-plugin')     //打包的css拆分,将一部分抽离出来  
 module: {       //模块的相关配置
      rules: [     //根据文件的后缀提供一个loader,解析规则
          {
              test: /\.less$/, //正则匹配我们以.less结尾的文件
              use: ExtractTextPlugin.extract({
                  fallback: 'style-loader',
                  use: [
                  'css-loader',
                  'less-loader'
                  ]
              })
          },
      ]},
   plugins:[
      new ExtractTextPlugin('[name].css'),  //[name] 默认  也可以自定义name  声明使用
   ]

У нас нет нашего css после выполнения нашей сборки npm run, почему? Оказалось css в js в конфигурации webpack. Это означает, что наш css упакован в наш js, поэтому мы ввели плагин extract-text-webpack-plugin, чтобы удалить из него css. Но другой вопрос, механизм require?

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

После упаковки мы оказались в лайв-сервере и обнаружили, что наши стили тоже поднялись, а css часть отделилась.

🍊настройка js в webpack

Теперь, с ростом популярности es6, все больше и больше кодов используют es6, но многие браузеры не поддерживают es6, например async/aviat, const. Поэтому нам нужно сослаться на babe, чтобы скомпилировать наш код es6 в es5. Создайте новый .babelrc в каталоге с простой конфигурацией

{"presets": ["env"]}

Установите наш Babel и настройте его в модуле/правилах в webpack.config.js.

yarn add babel-loader babel-core  abel-preset-env -D  //babel基本的三个文件
 {
    test: /\.js$/,  //es6 => es5 
    include: [
        path.resolve(__dirname, 'src')
    ],
    // exclude:[], 不匹配选项(优先级高于test和include)
    use: 'babel-loader'
},

🥕Настройка ресурсов изображения в вебпаке

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

пряжа добавить загрузчик файлов -D модуль/правила в webpack.config.js

 {  
    test: /\.(png|jpg|gif)$/, //匹配所有格式的图片资源
    use: [
        {
            loader: 'file-loader' 
        }
    ]
}

🍌Конфигурация псевдонима (@) в веб-пакете

В src/index.js мы вводим

const format = require('utils/format')  // utils ?  没有相对路径  回想@  => 别名
在src新建相应的文件。在format.js里接受一个参数并把它转成大写
module.exports = function format(chars) {
    return chars.toUpperCase()
}

Как настроить наш псевдоним в webpack? В vue-cli у нас часто @ папка, значит в каталоге src, сейчас разберемся. Под модулем обратите внимание на тот же уровень, что и правила

 resolve: { //解析模块的可选项  
        // modules: [ ]//模块的查找目录 配置其他的css等文件
        extensions: [".js", ".json", ".jsx",".less", ".css"],  //用到文件的扩展名
        alias: { //模快别名列表
            utils: path.resolve(__dirname,'src/utils')
        }
    },

🍒 Конфигурация некоторых других статических ресурсов в webpack

  • Другие файлы в src копируются напрямую в каталог dist. Не каждый файл нужно упаковывать и обрабатывать. Многие ресурсы можно копировать напрямую. Используйте наш плагин CopyWebpackPlugin
  • Эталонная библиотека инструментов jquery lodash повторно используется многими компонентами, что устраняет необходимость в импорте. Используйте плагин webpack.ProvidePlugin

5. Что случилось с npm run dev

В vue-cli запускаем мониторинг npm run dev, чтобы время от времени следить за изменениями файлов под нашим src, так что же с ним случилось. По сути, в webpack создается нод-процесс, а внутри него через webpack-dev-server инкапсулируется нод-экспресс модуль, элементы конфигурации такие

"scripts": { //在package.json里声明下使用脚本 npm run dev
    "build": "webpack --mode production",
    "start": "webpack-dev-server --mode development"
  }, 
devServer: {  //在webpack.config.js里配置port
        port: '8080',
        before(app) {
            app.get('/api/test.json', (req, res) => {
                res.json({
                    code: 200,
                    message: 'Hello World'
                })
            })
        }
    }  //服务于webpack-dev-server  内部封装了一个express 

fitting

сообщение

Webpack широк и глубок, и это только начало. Не бывает в одночасье изучить то, что на самом деле в ней есть. Tapable, жизненный цикл webpack и т. д. Если вы хотите глубже понять веб-пакет, рекомендуетсяКоманда Tencent ivwebГлубокое погружение в веб-пакет. Это тоже то, что я наблюдал в последнее время.Только понимая больше, вы можете летать дальше. Была поздняя ночь, и время пролетело быстро. Хозяин тоже слишком сонный, поэтому я перестал писать сюда, надеюсь, вы меня потерпите. Прикрепите мою обучающую демонстрацию github о конфигурации webpack4.0кликните сюда.