#1 Сборщик модулей webpack . Часть 1.

poster
В этом уроке мы разберем что такое webpack, как описывать его конфиг и как подключать модули друг к другу.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

Всем привет! Сегодня мы начинаем серию уроков, посвященных webpack.

При разработке большого проекта очень часто возникает необходимость разбивать код на отдельные модули, которые будут взаимодействовать между собой. На сегодняшний день для этого существует два подхода: это AMT и CommonJS. Они оба позволяют разрабатывать изолированные модули, не думать о порядке их загрузки, собирать все наши модули в один js-файл, безопасно подключать сторонние библиотеки. Вы спросите: "Что же такого нового могли придумать на сегодняшний день?". Поэтому в этих нескольких уроках мы разберем какие плюсы дает нам webpack и как его использовать.

Для начала вам нужно поставить webpack глобально. Для это пишем команду

npm install webpack -g

Далее создаем новый файл main.js и напишем в нем

console.log('Hello webpack');

Теперь, если в консоли мы напишем

webpack main.js bundle.js

то мы увидим сообщение, что bundle.js был успешно создан. В архитектуре проекта он также появился и в нем мы видим наш console.log('Hello webpack'). Теперь давайте к index.html подключим скрипт

<script src="bundle.js"></script>

Если теперь мы посмотрим в браузер, то мы увидим, что в консоли Hello webpack отлично отрабатывает. Так как писать команды в консоли, а также указывать для них аргументы не удобно, то для webpack можно создать файл конфига. Он должен называться webpack.config.js. В нем мы напишем

module.exports = {
    entry: './main.js'
}

Это будет наш объект с опциями. Самая главная опциия - это entry. Entry - это точка входа в наше приложение. В данном случае у нас точкой входа является файл main.js. Имеено он будет загружаться самым первым и реквайрить все остальные файлы. Далее мы можем задать output.

module.exports = {
    entry: './main.js',
    output: {
        filename: 'bundle.js'
    }
}

Output - это обьект, в котором мы можем указать опции для файла, в который будут собираться наши модули. В данном случае, если мы зададим filename bundle.js, то у нас останется все без изменений, так как это название результирующего файла по умолчанию. Теперь в консоли webpack мы можем просто прописать

webpack

ничего не указывая дополнительно и у нас будет тот же самый результат. Если мы в файле main.js изменим имеющуюся запись на

document.write('Hello webpack');

и запустим webpack в консоли, а затем посмотрим в браузере, то на экране мы увидим надпись Hello webpack. Также в консоли очень не удобно каждый раз после того, как мы что-то изменили, постоянно запускать

webpack

Для того, чтобы этого избежать, существует команда

webpack --watch

Это команда webpack, которая позволяет вотчить изменения в файлах. Теперь, если мы внесем какие-либо изменения в нашу строку, например, добавим три знака восклицания

document.write('Hello webpack!!!');

и посмотрим в консоль, то мы увидим: во-первых, код отработал точно также, как есди бы мы запустили webpack; во-вторых, при обновлении браузера, мы увидим, что у нас изменилось сообщение. Теперь, давайте применим хоть что-то, для чего создавалась модульная архитектура. Давайте создадим новый модуль content.js и внутри напишем

module.exports = "This is some content";

module.exports - это как раз то, что будет экспортированно в модуль контента. То есть мы можем писать в файле любую информацию, но только то, что мы напишем в module.exports и присвоим - будет возвращено с этого модуля, как его содержимое. Тут может быть и объект, но в данном случае давайте укажем строку. Теперь, давайте в файле main.js изменим код и напишем

document.write(require('./content'));

Не будем указывать расширение .js. Как мы видим - вотч все еще висит и теперь при обновление страницы браузера мы увидим надпись на экране - This is some content. Как мы понимаем, этот код у нас написан в файле content.js (который является модулем), в файле main.js - мы реквайрим данный модуль. Благодаря этому, нам становится доступным весь контент, который мы возвращаем из content.js. В данном случае нам доступна строка require('./content') и мы выводим ее в document.write. Как мы видим расширение .js можно не указывать, при этом код все-равно будет отрабатывать. На мой взгляд, плюсы webpack, которые мы увидели в этом уроке:

простота использования - нам достаточно использовать require, для того, что зарекваирить какой-то компонент, и module.exports - для того, чтобы указать, что мы хотим вернуть из этого модуля;

простота настройки - webpack имеет досточно маленький конфиг файл и, впринципе, мы в нем указали достаточно мало настроек, можно делать больше, но при этом они все-равно останутся читабельными;

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

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
016
8 лет назад
Добрый день! Как я понял, работа с различными версиями webpack несколько отличается. Для нас важно загрузить к проекту вполне конкретную версию. Однако при установке webpack мы везде указываем npm i webpack или yarn add webpack - и загружается ПОСЛЕДНЯЯ версия, т.е. webpack-4. Более того, когда используешь yarn, добавление версии к названию webpack - webpack@2.2.1 , сходу обрывает установку и дает ошибку. В чем подвох? Как установить нужную версию и почему во всех объяснениях просто указывают npm i webpack и детализацию версии обходят стороной?
monsterlessons
8 лет назад
Добрый день. Вы абсолютно правы и кроме слова "webpack" сюда можно подставить любую другую технологию. Версии обычно отличаются кардинально. Если вы хотите, чтобы все работало как в уроке, то клонируйте проект урока. Тогда у вас установится webpack 1. yarn add webpack@2.2.1 должно установить версию 2.2.1 нужно дебажить какую ошибку дает и почему. Так как 90% туториалов в интернете бесплатные, но они абсолютно не подробные и никто не расчитывает на то, что его будут смотреть через 3 года с другой версией.
cerise
8 лет назад
Здравствуйте! После того как в консоли прописала "webpack main.js bundle.js", то вылезла вот такая ошибка WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for th is value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment. You can also set it to 'none' to disable any default behavior. Learn more: https ://webpack.js.org/concepts/mode/ ERROR in multi ./main.js bundle.js Module not found: Error: Can't resolve 'bundle.js' in 'D:\project\webpack\01-web pack' @ multi ./main.js bundle.js прошла я по указанному сайту, прописала "webpack --mode=production", но лучше не стало, то есть тоже самое И я не понимаю, что делать. Помогите
monsterlessons
8 лет назад
Эти уроки снимались для Webpack 1. Вы же пытаетесь запустить код с версией Webpack 4. Если вы хотите, чтобы все работало как в уроке, то используйте исходный код урока.
Aleksandr Polyakh
9 лет назад
Доброе врмя суток, подскажите пожалуйста не могу правильно настроить тесты, из этой статьи, получаю ошибку вот такого плана C:\Users\Polyakh\Desktop\webpack\src\test\test_helper.js:1 (function (exports, require, module, __filename, __dirname) { import chai from 'chai'; Скриншот, все пути, ошибка: http://prntscr.com/gxzqmf
monsterlessons
9 лет назад
Добрый день. Ошибка говорит о том, что mocha не видит почему-то вашего babel. Вот у людей такие же проблемы: https://github.com/mochajs/mocha/issues/2655 http://jamesknelson.com/testing-in-es6-with-mocha-and-babel-6/ Проверьте, что у вас все так же настроено.
Aleksandr Polyakh
9 лет назад
Спасибо огромное, вы как всегда на высоте. Очень плохо, не знаю англ(( буду идти на курса. Подскажите пожалуйста, тесты проходят но получаю вот такой ворнинг: 'Could not find any test files matching pattern: file-you-want-test' и (node:6132) DeprecationWarning: "--compilers" will be removed in a future version of Mocha; see https://git.io/vdcSr for more info настройка из package.json: "test": "mocha --compilers js:babel-core/register file-you-want-test ./src/test/test_helper.js --recursive", "test:watch": "npm run test -- --watch" Спасибо!
monsterlessons
9 лет назад
удалите слово file-you-want-test из package.json test. Хочу заметить на будущее, что я отвечаю только на комментарии относящиеся непосредственно к уроку, или близко к нему, и не даю консультаций к коду не связанному с уроками.
Aleksandr Polyakh
9 лет назад
Хорошо, спасибо Вам. Будет видео у вам по тестированию?
monsterlessons
9 лет назад
Есть в планах, но не в ближайшем времени.
Aleksandr Polyakh
9 лет назад
Какое ваше отношение к тестам? Стоит тратить на них время?
monsterlessons
9 лет назад
Все их хотят писать, но никто не пишет. Я бы сказал, что знать их надо, а применять, по желанию команды/проекта.
Aleksandr Polyakh
9 лет назад
Webpack 2 merge, не верно склеивает объекты, что делаю не так?При разработке шибок нет, не работают alias. Ссылка на webpack.config.js: https://codepen.io/PolyakhAlex/pen/LzLQOQ?editors=1010 Подскажите пожалуйста, что сделал не так.
monsterlessons
9 лет назад
Я никогда не использовал webpack-merge. Попробуйте законсолить common и посмотреть так ли он выглядит, как вы ожидаете.
Aleksandr Polyakh
9 лет назад
Проверил, все хорошо, подскажите пожалуйста alias, верно прописал, версия webpack 2.7.0? Все работает как должно, кроме alias, когда импоритрую
monsterlessons
9 лет назад
Выглядит вроде бы правильно. Я ошибки не вижу.
Aleksandr Polyakh
9 лет назад
Скажите пожалуйста, вы используете alias? если да скиньте пожалуйста этот кусочек. Спасибо Вам!
monsterlessons
9 лет назад
Нет, не использую. Потому что это усложняет поддержку и понимание проекта, а также модули сложнее копировать из одного места в другое.
Aleksandr Polyakh
9 лет назад
Спасибо, делал так. У меня Windows 7, вот, что получаю по итогу http://prntscr.com/gjdbi9 (ссылка на скриншот)
monsterlessons
9 лет назад
Так первая же команда у вас принялась. После нее просто вызывайте node index.js или любую команду, которая вам нужна. Вторая команда невалидна для windows.
Aleksandr Polyakh
9 лет назад
Если Вас не затруднит, подскажите пожалуйста как избавиться от вечного ../../?
monsterlessons
9 лет назад
{ resolve: { extensions: ['.js', '.jsx'], modules: ['node_modules', path.resolve(__dirname, 'src')] } } import App from 'App'
Aleksandr Polyakh
9 лет назад
Спасибо, все работает. Подскажите пожалуйста, перешел на v3 webpack, получаю вот такую ошибку: (node:5868) DeprecationWarning: Chunk.modules is deprecated. Use Chunk.getNumberOfModules/mapModules/forEachModule/containsModule instead. Удалось выяснить, что это связано с 'Extract Text Plugin', но внятного решения проблемы не нашел. Если Вы решили эту проблему, подскажите мне пожалуйста.
monsterlessons
9 лет назад
Я не использовал пока Webpack 3, так что не сталкивался.
Aleksandr Polyakh
9 лет назад
Всем, доброе время суток. подскажи как задать переменную NODE_ENV=production OS, Windows "NODE_ENV" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
monsterlessons
9 лет назад
Просто выполните set NODE_ENV=production перед тем как выполнять вашу команду.
Aleksandr Polyakh
9 лет назад
Доброе время суток, подскажите пожалуйста к готовой сборке 'create react app', когда пишу команд 'npm run build' папка в который собирается проект переименовать к примеру 'dist' вместо 'build'. Это необходимо для jenkins он выдает ошибку. Спасибо Вам!
monsterlessons
9 лет назад
Добрый день. Вот отличный ответ на эту тему на СО https://stackoverflow.com/a/41495859/1630144 Вкратце: Это делать не рекомендуется, так как это конвенция create-react-app. На мой взгляд самый правильный вариант, это перемещать билд файлы куда вам нужно после выполнения билд команды. "build": "react-scripts build && mv build webapp" Еще один вариант, это сделать eject и поддерживать create-react-app самостоятельно. Тогда можно изменять конфиги как хочется.
Aleksandr Polyakh
9 лет назад
Спасибо, у меня работала команда 'npm run build' после того как прописал 'eject' и запуская 'npm run build' получаю ошибку: (подскажите в чем причина ) package.js https://codepen.io/PolyakhAlex/pen/JybWKG?editors=1010 Search for the keywords to learn more about each error. npm ERR! Windows_NT 10.0.15063 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "build" "--scripts-prepend-node-path=auto" npm ERR! node v6.11.1 npm ERR! npm v3.10.10 npm ERR! code ELIFECYCLE npm ERR! template@1.0.0 build: `npm run build-css && node scripts/build.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the template@1.0.0 build script 'npm run build-css && node scripts/build.js'. npm ERR! Make sure you have the latest version of node.js and npm installed. npm ERR! If you do, this is most likely a problem with the template package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! npm run build-css && node scripts/build.js npm ERR! You can get information on how to open an issue for this project with: npm ERR! npm bugs template npm ERR! Or if that isn't available, you can get their info via: npm ERR! npm owner ls template npm ERR! There is likely additional logging output above. npm ERR! Please include the following file with any support request: npm ERR! C:\Users\Polyakh\Downloads\reactJS-template\npm-debug.log
monsterlessons
9 лет назад
Так сложно сказать. Нужно дебажить на вашей машине.
Aleksandr Polyakh
9 лет назад
Посоветуйте пожалуйста, готовую сборку react\redux\router. Спасибо!
monsterlessons
9 лет назад
У меня нет готовой сборки, так как под каждый проект необходим свой набор пакетов и обычно приходится всю сборку делать самому, так как ни один готовый бойлерплейт обычно не подходит.
Aleksandr Polyakh
9 лет назад
Вообщем надо разбираться мне с webpack + nodejs) это будет долго. Спасибо Вам!
monsterlessons
9 лет назад
Надо. Это в любом случае необходимые знания.
Aleksandr Polyakh
9 лет назад
Я думал, что для front-end nodeJS не нужен)
monsterlessons
9 лет назад
Нужен конечно. Как минимум на уровне установить пакеты, написать конфиг для вебпака и т.п.
Aleksandr Polyakh
9 лет назад
Посоветуйте пожалуйста, что почитать! На русском если это возможно, спасибо Вам!
monsterlessons
9 лет назад
У меня нет каких-то определенных книг или ресурсов. Читайте туториалы, гайды и видео. Их в интернете сейчас огромное количество на любую тему.
Aleksandr Polyakh
9 лет назад
Стоит задача переименовать папку, build на dist для работы в Jenkins. Доброе время суток, подскажите пожалуйста использовал сборку create-react-app, запустил команду 'eject' в корне получил папку config, изменил в файле patch.js в строчке 44 appBuild: resolveApp('build' на appBuild: resolveApp('dist') ничего не сработало( npm run build отработал, пака не изменила название на dist ), удалил все содержимое файла, запустил npm run build все работает без ошибок, подскажите пожалуйста где подключить этот конфиг после команды 'eject'? Спасибо большое!
monsterlessons
9 лет назад
Так сложно сказать. Нужно дебажить на вашей машине.
Владислав
9 лет назад
Здравствуйте, сейчас с напарником работает по следующей системе, накатываем composer, фреймворк yii2, на котором пишется серверная часть (api), отображение происходит с помощью reactJs, как можно накатить npm, babel на наш проект? Потому что сейчас приходится скачивать с репозитория react и руками прописывать пути.
monsterlessons
9 лет назад
Добрый день. Вы можете полностью разделить апи и фронтенд. Ваш фронтенд собирается с npm, react и подключается либо в шаблон отрендереный на yii, либо можно отрендерить шаблон с js на ноде например и проксировать запросы в ваше API. Любое SPA строится по принципу без разницы какое апи, мы просто проксируем к нему запросы. И тогда API серверу без разницы как строится фронтенд.