Использование webpack с существующим проектом PHP и JS

У меня есть существующий проект PHP с jquery и bootstrap, а не с использованием каких-либо интерфейсных фреймворков.

Я пытаюсь использовать модуль пакета webpack, чтобы создать единую точку входа для моих ресурсов проекта, управлять зависимостями js с менеджером пакетов js узла, запускать задачи, как минимизировать js css, изменить размер изображения... и т.д. И улучшите время загрузки браузера, необходимое для загрузки одной страницы.

Я наткнулся на учебники по webpack и установил его и установил его dev-сервер, но проблема в том, что я не могу понять, как я буду конвертировать все мои текущие js-скрипты и css-ссылки в проект (где у меня много библиотек jquery и CSS, используемых для предоставления нескольких функций в проекте) для использования webpack.

Должен ли я переписывать все мои файлы JS и CSS таким образом, который подходит для webpack? Как сделать успешную миграцию?

Кроме того, я не могу запустить мое текущее приложение php на devp-сервере webpack, значит, оно предназначено для запуска там в первую очередь? Пока что это список каталогов проекта.

Я создал файл index.js и использовал следующую конфигурацию webpack:

var path = require('path');
var webpack = require('webpack');

module.exports =
{
    entry: [
        './public/js/index.js',
        'webpack/hot/dev-server',
        'webpack-dev-server/client?http://localhost:8080'
    ],
    plugins: [
      new webpack.HotModuleReplacementPlugin()
    ],
    output: {
        path: path.join(__dirname, "public/dist/js"),
        publicPath : "http://localhost:8080/my_proj/public/dist/js",
        filename: "bundle.js"
    }

};

Я добавил bundle.js к моему скрипту, загружающему только для тестирования, следующим образом, надеясь, что приложение будет запущено на dev-сервере webpack:

<script type="text/javascript" src="public/dist/js/bundle.js"></script>
<script type="text/javascript" src="public/js/jquery.min.js"></script>
<script type="text/javascript" src="public/js/jquery.migrate.js"></script>
<script type="text/javascript" src="public/js/jquery.bxslider.min.js"></script>
<script type="text/javascript" src="public/js/jquery.appear.js"></script>
<script type="text/javascript" src="public/js/jquery.countTo.js"></script>
<script type="text/javascript" src="public/js/bootstrap.js"></script>

Пожалуйста, помогите мне понять концепцию здесь и как я могу успешно выполнить эту миграцию?

Ответ 1

Во-первых, чтобы ответить на ваши меньшие вопросы:

  • Нет, вы не должны запускать ваше PHP-приложение через сервер веб-пакетов. Объясняется в разделе "живая перезагрузка" ниже.
  • Нет, вам не придется переписывать свои активы. Наверное. Смотрите разделы CSS и Edge Cases ниже.

Отказ от ответственности: я возьму только небольшую часть вашего вопроса. Сфера его охвата слишком широка, чтобы вместить его в один ответ StackOverflow.

Я только свяжусь с

  • настройка среды разработки и производства для веб-пакета
  • ваш первый JavaScript

что должно дать вам основу для дальнейшего развития.

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

Итак, отпусти.

Требования

Я предполагаю, что на вашем компьютере установлены Node.js и npm, и вы примерно знаете, как их использовать.

Я также предполагаю, что у вас есть webpack и webpack-cli установленные как (dev) зависимости вашего проекта (не только глобально):

npm install --save-dev webpack webpack-cli

Обновление: более ранние версии этого ответа не требовали установки webpack-cli. Начиная с версии 4 (февраль 2018 года) CLI веб-пакета находится в своем собственном пакете, следовательно, необходим дополнительный пакет.

Настроить разработку и рабочий процесс производства

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

Чтобы добиться этого, мы хотим разделить наши файлы конфигурации.

Подготовьте структуру каталогов

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

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

Создание config.base.js, а config.production.js и config.development.js файл в этой папке.

Отлично, теперь у нас есть файлы конфигурации для двух цепочек сборки. Конфигурации все еще пусты, поэтому давайте теперь заполним их некоторой базовой логикой.

Установить webpack-merge

Но сначала нам нужно установить webpack-merge.

npm install --save-dev webpack-merge

Этот пакет позволяет нам глубоко объединить несколько конфигураций веб-пакетов. Мы хотим использовать его для создания конфигураций веб-пакетов в зависимости от нашей текущей среды.

Настройте свою конфигурацию

Теперь настройте ваш build/config.base.js:

module.exports = {
  // We'll place webpack configuration for all environments here
}

Файл, очевидно, просто экспортирует пустой объект прямо сейчас, но нам это понадобится для следующих шагов.

Поместите этот код в ваш build/config.production.js:

const merge = require('webpack-merge')

module.exports = merge(require('./config.base.js'), {
  mode: 'production'

  // We'll place webpack configuration for production environment here
})

И почти такой же код входит в ваш build/config.development.js:

const merge = require('webpack-merge')

module.exports = merge(require('./config.base.js'), {
  mode: 'development',
  watch: true

  // All webpack configuration for development environment will go here
})

Я думаю, это довольно интуитивно понятно, что это делает:

Использование webpack с конфигурацией config.development.js извлечет общую конфигурацию и объединит ее собственное объявление конфигурации в.

Обновление: опция mode в вышеупомянутых конфигурационных файлах была добавлена в webpack 4 (выпущен в феврале 2018 г.). Он устанавливает множество разумных значений по умолчанию для комплектов разработки и производства.

Теперь запуск процесса будет выглядеть так из командной строки:

npx webpack --config build/config.development.js

# If the above doesn't work, you probably have an older version of npm (< 5.1) installed
# While npx is a really great tool, you can of course still call the path of the webpack executable manually:

node_modules/.bin/webpack --config build/config.development.js

... и наоборот для production среды.

Эту команду довольно неудобно использовать, но не стоит беспокоиться, об этом мы поговорим позже.

Сделайте несколько вспомогательных файлов

Есть информация, которую мы хотим централизовать, чтобы сделать ее легко обменной. Пути к файлам такие вещи. Итак, давайте извлекать их.

Создайте paths.js в папке build и экспортируйте пути, которые мы хотим использовать позже:

const path = require('path')

// I'm really just guessing your project folder structure from reading your question,
// you might want to adjust this whole section
module.exports = {
  // The base path of your source files, especially of your index.js
  SRC: path.resolve(__dirname, '..', 'public'),

  // The path to put the generated bundle(s)
  DIST: path.resolve(__dirname, '..', 'public', 'dist'),

  /*
  This is your public path.
  If you're running your app at http://example.com and I got your DIST folder right,
  it'll simply be "/dist".
  But if you're running it locally at http://localhost/my/app, it will be "/my/app/dist".

  That means you should probably *not* hardcode that path here but write it to a
  machine-related config file. (If you don't already have something like that,
  google for "dotenv" or something similar.)
  */
  ASSETS: '/dist'
}

Создать псевдонимы

Как упоминалось выше, мы могли бы технически запустить нашу цепочку сборки в режиме development следующим образом:

npx webpack --config build/config.development.js

Это неудобная многословная команда, так что давайте изменим это.

Это намного удобнее для запуска процесса сборки с помощью скриптов npm. Добавьте один скрипт для каждой среды в ваш package.json следующим образом:

{
  "scripts": {
    "dev": "webpack --config build/config.development.js",
    "prod": "webpack --config build/config.production.js"
  }
}

Теперь вы можете запускать цепочки сборки с помощью npm run dev resp. npm run prod - который легче запомнить и быстрее набирать.

... как только будет что строить, конечно.

Bundle JavaScript

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

Итак, давайте начнем с чего-то более захватывающего: мы определим точку входа JavaScript.

Определить точку входа

Поместите следующий код в ваш build/config.base.js (полностью заменив существующий код):

const path = require('path')
const { SRC, DIST, ASSETS } = require('./paths')

module.exports = {
  entry: {
    scripts: path.resolve(SRC, 'js', 'index.js')
  },
  output: {
    // Put all the bundled stuff in your dist folder
    path: DIST,

    // Our single entry point from above will be named "scripts.js"
    filename: '[name].js',

    // The output path as seen from the domain we're visiting in the browser
    publicPath: ASSETS
  }
}

Создайте файл JavaScript

В приведенной выше конфигурации ожидается, что index.js будет index.js в вашей папке SRC/js (как определено в build/paths.js).

Давайте создадим этот файл со следующим содержимым:

import './jquery.min.js'
import './jquery.migrate.js'
import './jquery.bxslider.min.js'
import './jquery.appear.js'
import './jquery.countTo.js'
import './bootstrap.js'

Как видите, index.js просто импортирует все файлы, которые вы хотите использовать.

Если вы сейчас бежите

npm run prod

от вашего терминала, scripts.js файл будет создан в вашей DIST папке. Вы можете включить это в свою разметку с помощью простого <script>.

Поздравляем, у вас есть работающая настройка веб-пакета!

Погружение глубже

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

Я перечислю еще несколько вещей, которые вы можете улучшить, с некоторыми ссылками для чтения.

Концепции webpack

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

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

Многие из подсказок в этом списке также объясняются там.

Подробнее: SurviveJS - учебник по веб-пакетам

Разделение кода

Он делает то, что говорит название: вы можете не захотеть упаковать весь ваш JavaScript в один громоздкий выходной файл.

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

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

Подробнее: Документация по webpack - Разделение кода

Кэширование

Возможно, вы захотите улучшить поведение кэширования своего сайта, добавив хеш к именам связанных файлов, который зависит от их содержимого. Это позволит создать (к примеру) script.31aa1d3cad014475a618.js вместо того, scripts.js.

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

Ваш PHP-код может затем использовать webpack-manifest-plugin для получения доступа к сгенерированным именам файлов.

Прочитайте больше:

Transpiling

Если вы хотите использовать современный код ES2015 на своем сайте JavaScript (и нацелены на не вечнозеленые браузеры), вы захотите перенести их на обычную ES5. (Если термин "ES2015" не имеет для вас никакого смысла, скорее всего, вы его не используете и можете игнорировать этот параграф.)

Подробнее: babel-loader - загрузчик, который запускает Babel на ваших скриптах

CSS

Есть загрузчики веб-пакетов для CSS. И Sass. И PostCSS. Все что тебе нужно.

А поскольку вы, вероятно, не планируете включать свой CSS с помощью тегов <script>, познакомьтесь с плагином Extract Text для создания реальных файлов .css.

Обновление: Плагин Извлечения текста очень установлен. Однако на самом деле это своего рода хак: он генерирует файлы .css хотя веб-пакет знает только JavaScript в качестве целевого языка.

Однако это больше не относится к веб-пакету 4. Теперь существует система для определения произвольных типов модулей, включая CSS.

Короче говоря: в ближайшее время ожидается, что встроенная поддержка CSS в веб-пакете заменит плагин Extract Text.

Подсказка: Пути

Я упомяну это, потому что это было для меня настоящей проблемой, пока я не понял, как работает веб-пакет:

Имейте в виду, что webpack распознает ваши выражения url(...) и попытается разрешить их относительно ваших исходных файлов.

Это означает, что ваш исходный файл public/css/main.css:

body {
  background: url('../img/bg.jpg');
}

если ваш выходной путь - public/dist/css/bundle.css, будет преобразован в:

body {
  background: url('../../img/bg.jpg');
}

Прочитайте больше:

Минимизация

Обновление: поскольку webpack 4 был выпущен в феврале 2018 года, этот раздел устарел. Установка опции "production" mode для нового mode теперь автоматически применяет минимизацию JavaScript.

Существует Terser плагин для WebPack, чтобы Минимизировать ваш JavaScript. Сокращение CSS - это функция, уже встроенная в плагин css-loader упомянутый выше.

Читать подробнее: Terser Webpack Plugin

Оптимизация изображения

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

Это не означает, что веб-пакет не способен сделать это. Есть плагины практически для всего.

Прочитайте больше:

Live Перезагрузка

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

В вашем случае, webpack-dev-server вероятно, совсем не тот инструмент. webpack-livereload-plugin попробуйте webpack-livereload-plugin для живого перезагружателя, который вы можете просто включить с помощью <script>.

Читать подробнее: webpack-livereload-plugin

Исходные карты

Обновление: Начиная с веб-пакета 4 (выпущенного в феврале 2018 года), исходные карты генерируются автоматически, когда для нового mode задано значение "development".

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

Подробнее: Документация веб-пакета - Карты источников

Краевые чехлы

Обычно все ваши существующие сценарии, которые вы будете обрабатывать с помощью веб-пакета, должны работать нормально.

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

Посмотрите на следующий код:

function myFunc () {
  console.log('I exist!')
}

Этот код в простом файле JavaScript сделает myFunc доступным везде в вашем коде JS. Но поскольку код пакета веб-пакета заключен в функции обратного вызова (и, следовательно, выходит из глобальной области видимости), доступ к этой функции больше не будет.

Сторонние библиотеки не должны быть проблемой, они обычно присваивают свои глобальные переменные объекту window напрямую, но если вы уже написали код JS в своем проекте, вы должны знать об этом.

Автоматизируйте!

Вы захотите автоматизировать как можно большую часть вашего рабочего процесса.

Подумайте о запуске npm run prod через git hook до нажатия/после вытягивания.


Надеюсь это поможет.

Ответ 2

На основе существующих vue-шаблонов и ответа от @Loilo я создал шаблон vue, который вы можете установить с помощью vue-cli. Этот шаблон запускает вас для приложения VUE, которое вы можете расширить или интегрировать в существующую среду.

npm install -g vue-cli
vue init delcon/webpack-simple my-project
cd my-project
npm install

devwatch:

Этот шаблон имеет дополнительную опцию запуска devwatch, которая отслеживает файлы, вместо использования webpack-dev-сервера. Это делает его пригодным для использования в любой существующей среде веб-сервера.

npm run devwatch

Dev:

чтобы запустить его с помощью webpack-dev-сервера по умолчанию, удалите <script src="http://localhost:35729/livereload.js"></script> в index.html:

npm run dev

построить:

для создания вашего проекта для производства:

npm run build