Webpack.config как просто скопировать index.html в папку dist
Я пытаюсь автоматизировать активы, входящие в /dist. У меня есть следующий config.js:
module.exports = {
context: __dirname + "/lib",
entry: {
main: [
"./baa.ts"
]
},
output: {
path: __dirname + "/dist",
filename: "foo.js"
},
devtool: "source-map",
module: {
loaders: [
{
test: /\.ts$/,
loader: 'awesome-typescript-loader'
},
{ test: /\.css$/, loader: "style-loader!css-loader" }
]
},
resolve: {
// you can now require('file') instead of require('file.js')
extensions: ['', '.js', '.json']
}
}
Я также хочу включить main.html из каталога, который находится рядом с /lib, в папку /dist при запуске webpack. Как я могу это сделать?
ОБНОВЛЕНИЕ 1 2017 _____________
Мой любимый способ сделать это сейчас - использовать html-webpack-plugin
с файлом шаблона. Благодаря принятому ответу тоже! Преимущество этого способа заключается в том, что в файле индекса также будет добавлена ссылка cachbusted js из коробки!
Ответы
Ответ 1
Опция 1
В вашем файле index.js
(т.е. В записи в веб-пакете) добавьте требование к вашему index.html
через плагин загрузчика файлов, например:
require('file-loader?name=[name].[ext]!../index.html');
Как только вы соберете свой проект с помощью веб-пакета, index.html
будет в выходной папке.
Вариант 2
Используйте html-webpack-plugin, чтобы вообще не иметь index.html. Просто создайте файл для вас.
Ответ 2
Я добавлю вариант ответа VitalyB:
Вариант 3
Через npm. Если вы запустите свои команды через npm, вы можете добавить эту настройку в свой пакет package.json(также проверьте также webpack.config.js). Для разработки run npm start
нет необходимости копировать index.html в этом случае, потому что веб-сервер будет запущен из каталога исходных файлов, а bundle.js будет доступен из того же места (bundle.js будет жить в памяти, но будет доступна, как если бы она была расположена вместе с index.html). Для производственного запуска npm run build
и папка dist будет содержать ваши файлы bundle.js и index.html, которые будут скопированы с доброй старой командой cp, как вы можете видеть ниже:
"scripts": {
"test": "NODE_ENV=test karma start",
"start": "node node_modules/.bin/webpack-dev-server --content-base app",
"build": "NODE_ENV=production node node_modules/.bin/webpack && cp app/index.html dist/index.html"
}
Обновление: вариант 4
Существует copy-webpack-plugin, как описано в этом fooobar.com/questions/34858/...
Но в целом, за исключением самого "первого" файла (например, index.html) и более крупных активов (например, больших изображений или видео), включите css, html, изображения и т.д. прямо в ваше приложение через require
и webpack будет включать его для вас (ну, после правильной настройки с загрузчиками и, возможно, с плагинами).
Ответ 3
Вы можете использовать CopyWebpackPlugin. Он работает так:
module.exports = {
plugins: [
new CopyWebpackPlugin([{
from: './*.html'
}])
]
}
Ответ 4
Я бы сказал, ответ: вы не можете. (или по крайней мере: вы не должны). Это не то, что должен делать Webpack. Webpack является поставщиком, и его нельзя использовать для других задач (в этом случае копирование статических файлов - это еще одна задача). Для выполнения таких задач вы должны использовать инструмент Grunt или Gulp. Очень часто интегрируется Webpack как задача Grunt или как Gulp задача. У них обоих есть другие задачи, полезные для копирования файлов, как вы описали, например, grunt-contrib-copy или gulp-copy.
Для других активов (а не index.html
) вы можете просто связать их с помощью Webpack (для этого и предназначен Webpack). Например, var image = require('assets/my_image.png');
. Но я полагаю, что ваш index.html
не должен быть частью пакета, и поэтому это не является заданием для связки.
Ответ 5
Вы можете добавить индекс непосредственно в конфигурацию записи и использовать загрузчик файлов для загрузки
module.exports = {
entry: [
__dirname + "/index.html",
.. other js files here
],
module: {
rules: [
{
test: /\.html/,
loader: 'file-loader?name=[name].[ext]',
},
.. other loaders
]
}
}
Ответ 6
Эта работа хорошо работает в Windows:
-
npm install --save-dev copyfiles
- В
package.json
У меня есть задача копирования: "copy": "copyfiles -u 1 ./app/index.html ./deploy"
Переместите мой index.html из папки приложения в папку развертывания.
Ответ 7
Чтобы скопировать уже существующий файл index.html
в каталог dist
вы можете просто использовать HtmlWebpackPlugin, указав в качестве шаблона исходный index.html
.
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin({
template: './path/to/index.html',
})
],
// ...
};
Созданный файл dist/index.html
будет в основном таким же, как ваш исходный файл, с той разницей, что связанные ресурсы, такие как файлы .js, добавляются тегами <script>
через веб-пакет. Минификация и другие параметры могут быть настроены и задокументированы на github.
Ответ 8
Чтобы расширить ответ @hobbeshunter, если вы хотите использовать только index.html, вы также можете использовать CopyPlugin. Основная мотивация использования этого метода по сравнению с другими пакетами состоит в том, что это кошмар - добавлять много пакетов для каждого отдельного типа и настраивать его и т.д. Самый простой способ - использовать CopyPlugin для всего:
npm install copy-webpack-plugin --save-dev
затем
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
plugins: [
new CopyPlugin([
{ from: 'static', to: 'static' },
{ from: 'index.html', to: 'index.html', toType: 'file'},
]),
],
};
Как вы можете видеть, скопируйте всю статическую папку вместе со всем ее содержимым в папку dist. Нет CSS или файла или каких-либо других плагинов не требуется.
Хотя этот метод не подходит для всего, он сделает работу просто и быстро.
Ответ 9
Я также нашел это простой и достаточно универсальный, чтобы поместить мой index.html
файл в dist/
директории и добавьте <script src='main.js'></script>
в index.html
включить мои файлы в комплекте WebPack. main.js
видимому, является выходным именем по умолчанию для нашего пакета, если не указано иное в файле конфигурации webpack. Я думаю, что это не хорошее и долгосрочное решение, но я надеюсь, что оно поможет понять, как работает веб-пакет.