Рубрики
Без рубрики

Компиляция нашего Express Server с WebPack

В этой статье мы собираемся настроить боковую рендеринг серверов путем обработки Express с WebPack.

Автор оригинала: Lawrence Whiteside.

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

Мы собираемся начать, где мы остановились в последняя статья Если вам нужно догнать:

git clone https://github.com/lawwantsin/webpack-course.git
cd webpack-course
git checkout ssr-webpack
npm install

Целевой узел WebPack

Итак, в прошлый раз мы пытались сделать наши Одобрено Компонент мы побежали в проблему. Узел, Babel и Express со всеми там мощностью, не понимает изображений или урок. Узел может их потребовать или импортировать их в ES6, но узел всегда ожидает JavaScript, поэтому бросает изображение на компилятор JavaScript, и это происходит.

Узел сломался на Markdown

Круто, верно. Итак, оказывается, это довольно разрешимо. Есть несколько решений, таких как WebPack-Isomorphic-Tools Этот угон нуждается в выписке и замените его, в узле на стороне сервера. И пока это круто, это тоже устарело, так как Цель: «Узел» пришел в конфигурацию WebPack.

Целевой узел

Что нам нужно сделать, это использовать WebPack для обработки Express.js Таким образом, изображения и разметки соответствуют правильно обработаны, а затем запускают новый файл с узлом. Мы захочем создать новый «сервер» конфигурацию и добавить новый пакет.

touch config/webpack.server.js
npm install webpack-node-externals

Добавьте следующее в config/webpack.server.js :

const path = require("path")
const webpack = require("webpack")
const ExtractTextPlugin = require("extract-text-webpack-plugin")
var nodeExternals = require("webpack-node-externals") module.exports = env => { return { target: "node", externals: nodeExternals(), entry: { server: ["./src/server/main.js"] }, output: { filename: "[name]-bundle.js", path: path.resolve(__dirname, "../build"), }, module: { rules: [{ test: /\.js$/, exclude: /node_modules/, use: [ { loader: "babel-loader" }] }, { test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: { loader: "css-loader", options: { minimize: true } } }) }, { test: /\.jpg$/, use: [{ loader: "file-loader", options: { name: "/images/[name].[ext]", } } ] }, { test: /\.md$/, use: [{ loader: "markdown-with-front-matter-loader" }] } ] }, plugins: [new ExtractTextPlugin("[name].css"), new webpack.DefinePlugin({ "process.env": { NODE_ENV: JSON.stringify(env.NODE_ENV) } }), new webpack.NamedModulesPlugin() ] }
}

Прохладный. Итак, обратите внимание на первые 2 строки нашего конфигурации.

target: "node",
externals: nodeExternals(),

Это суть разницы. С целевым узлом мы говорим WebPack объединить наши активы для узла вместо сети. Цель: «Веб» это цель по умолчанию. Это изменение позволяет WebPack расти с постоянно меняющимся миром Комплекции устройства Отказ

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

В Выход Раздел Мы добавляем новую папку, папку сборки, поэтому скомпилированное расслоение, не сидит в общественном каталоге, как Dist Отказ Так что в терминале:

mkdir build

В Package.json Мы собираемся обновить наши сценарии.

"build:server": "BABEL_ENV=production webpack --config=config/webpack.server.js --env.NODE_ENV=production",

Теперь запустите:

npm run build:server

Взять Express.js и превратить его в Server-bundle.js Отказ

Сервер в комплекте

В вашем каталоге сборки вы найдете Server-bundle.js и папка изображений.

Теперь мы собираемся изменить наш скрипт прод в Package.json указывать на этот новый файл.

"prod": "NODE_ENV=production node build/server-bundle.js",

Мы можем удалить взломанные вещи в Aperot.js Наверх и заменить его нормальным требуемым.

const MarkdownData = require("../../data/post.md")
const imagePath = require("../images/link.jpg")

Итак, если мы бежим NPM запустить dev Мы должны увидеть index.ejs и main-bundle.js Горячая перегрузка как обычно. Теги стиля вводятся через стиль погрузчика.

Если мы запустим NPM Run Build: сервер и NPM запустить прод Мы запускаем сервер и видим разметку прямо в HTML.

Посмотреть источник

Давайте также сделаем это на стороне развития. В Package.json :

"dev": "node --inspect build/server-bundle.js"

И, наконец, у нас есть дополнительный файл, испускаемый на сервере Build. Изображение. Давайте изменим WebPack.server.js не излучать этот файл.

{ test: /\.jpg$/, use: [{ loader: "file-loader", options: { name: "/images/[name].[ext]", emitFile: false } } ]
},

В сумме

Мы сделали это. Мы открыли дверь еще одному использованию для WebPack. Это может скомпилировать серверный код с Узел Создать цель для включения всех типов файлов. Погрузчики позволяют. С новым файлом конфигурации мы создаем пакет сервера, который включает в себя markdown и другие типы активов в рендере. Мы можем использовать один и тот же конфигурацию сервера в производстве и разработки, но мы увидим, как сломать их и почему.

git checkout ssr-webpack-final

Следующий

В наших усилиях по построить Ultimate WebPack Boeterplate, мы все еще не совсем полностью. Одна вещь, которая препятствует нашему прогрессу, мы использовали WebPack только из командной строки. В следующем эпизоде мы собираемся посмотреть с помощью WebPack в качестве функции JavaScript для запуска и перезапуска нашего сервера после компиляции WebPack. Этот следующий шаг отделяет плюсы из тех, которые никогда не изучают истинную силу WebPack. Следите за обновлениями.