предисловие
Когда я использовал koa для написания сервера, публикация была кошмаром. Все файлы в src нужно перезаписать, и конфигурационный файл конфига тоже надо перезаписать.Если вы ненароком, о различных проблемах сообщат онлайн, а потом придется откатывать и подгонять локально и публиковать. Случайно наткнулся на статьюКак упаковать приложение koa с помощью веб-пакета, Удивительно, но оказывается, что и вебпак умеет упаковывать фон. Об этом никогда раньше не думали.
ключевой вопрос
Один: все модули в node_modules не упакованы
Основная функция веб-пакета состоит в том, чтобы ввести каждый модуль, на который ссылаются, в файл и унифицировать модульность модулей различных спецификаций (спецификация веб-пакета).
Однако узел содержит большое количество операций fs и path, после того как эти операции fs и path будут запакованы, объектов операции не будет, и будет выдаваться множество различных ошибок.
Таким образом, суть использования упаковки webpack заключается в том, чтобы отказаться от упаковки всех модулей в node_modules, а упаковать файлы, на которые ссылаются относительные пути, в один файл. Так уж получилось, что мы обнаружили, что webapck предоставляет атрибут externals для исключения модулей, которые не нужно упаковывать.
Углубившись, мы можем обнаружить, что такие модули, как webpack, nodemon и babel-preset-env, являются пакетами, от которых зависит среда разработки приложений, и наша программа вообще не потребует эти модули.
Подводя итог, мы можем обнаружить, что нам нужно только исключить все необходимые пакеты.Этот модуль соответствует модулю в зависимостях в package.json. Поймите разницу между зависимостями и devDependencies.
Поэтому мы можем использовать плагин externals-dependencies для работы со свойством externals для исключения зависимостей.
Код:
const webpack = require('webpack');
const _externals = require('externals-dependencies')
module.exports = {
...
externals: _externals(),
...
}
Два: цель указывает на узел
Официальная документация: скомпилировано в среду, подобную Node.js (при использовании Node.js требуется загрузка фрагментов)
Код:
target: 'node',
Три: увеличить конфигурацию узла
Официальная документация: эти параметры определяют, следует ли полифиллировать или имитировать определенные глобальные переменные и модули Node.js. Это позволяет выполнять код, изначально написанный для среды Node.js, в других средах, например в браузерах.
Код:
node: {
console: true,
global: true,
process: true,
Buffer: true,
__filename: true,
__dirname: true,
setImmediate: true,
path: true
},
Четыре: конфигурация Babel
Чтобы быть совместимым с проблемой, что более ранние версии узла изначально не поддерживают async/await. Здесь я использую конфигурацию babel-preset-env{"modules": false}. Эта конфигурация преобразует синтаксис es6 в синтаксис es5, например, let и const в var.
В то же время все функции async/await также преобразуются в функцию _asyncToGenerator, определенную в полифилле.
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
На самом деле функция асинхронной функции реализована с помощью промиса.
Конечно, эта функция также нуждается в функции regeneratorRuntime во время выполнения. Поэтому я представил babel-polyfill глобально, чтобы обеспечить функцию regeneratorRuntime.
Примечание. Если ваша версия узла очень высокая и изначально поддерживает async/await, вы можете опустить babel-preset-env и babel-polyfill.
Код:
const path = require('path');
const webpack = require('webpack');
const _externals = require('externals-dependencies')
module.exports = {
entry: {
app: [
// 如果polyfill放在这里,打包的时候将不会被external,必须在js里require才能有效external
// 'babel-polyfill',
'./src/index.js'
]
},
output: {
path: path.resolve(__dirname),
filename: '[name].js'
},
resolve: {
extensions: [".js"]
},
target: 'node',
externals: _externals(),
context: __dirname,
node: {
console: true,
global: true,
process: true,
Buffer: true,
__filename: true,
__dirname: true,
setImmediate: true,
path: true
},
module: {
rules: [
{
test: /\.js/,
use: ['babel-loader']
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"development"'
}
}),
]
}
развертывать
После упаковки деплоить гораздо удобнее, нужно только деплоить package.json, app.js и html в просмотре онлайн. а затем выполнить на сервере
1. npm install
2. npm run for
Затем сервер работает в фоновом режиме. Если вам нужно обновить выпуск, вам нужно только повторно запустить npm run dev или npm run build, чтобы упаковать пакет локально и перетащить его на сервер, чтобы перезаписать app.js.