Недавно я создавал реактивный проект на основе веб-пакета и столкнулся с
output.publicPath
и в webpack-dev-сервереpublicPath
Проблемы, и описание их в официальных документах не очень понятное, поэтому я исследовал и написал эту статью.
output
Опция вывода указывает расположение вывода веб-пакета, из которых часто используются наиболее важные.path
иpublicPath
output.path
- По умолчанию:
process.cwd()
output.path
Просто укажите каталог вывода, соответствующийабсолютный путь, например, в проекте обычно делается следующая конфигурация:
output: {
path: path.resolve(__dirname, '../dist'),
}
output.publicPath
- По умолчанию: пустая строка
Объяснение publicPath в официальной документациида
webpack предоставляет очень полезную конфигурацию, которая помогает указать базовый путь для всех ресурсов в вашем проекте, который называется publicPath.
И непонятно, как применить этот путь...
На самом деле базовый путь всех ресурсов, упомянутых здесь, относится к базовому пути, когда в проекте упоминаются ресурсы css, js, img и др. Этот базовый путь следует использовать в сочетании с путем, указанным в конкретном ресурсе, поэтому в Фактически, путь доступа к упакованному ресурсу может быть использован. Он выражается следующей формулой:
静态资源最终访问路径 = output.publicPath + 资源loader或插件等配置路径
Например
output.publicPath = '/dist/'
// image
options: {
name: 'img/[name].[ext]?[hash]'
}
// 最终图片的访问路径为
output.publicPath + 'img/[name].[ext]?[hash]' = '/dist/img/[name].[ext]?[hash]'
// js output.filename
output: {
filename: '[name].js'
}
// 最终js的访问路径为
output.publicPath + '[name].js' = '/dist/[name].js'
// extract-text-webpack-plugin css
new ExtractTextPlugin({
filename: 'style.[chunkhash].css'
})
// 最终css的访问路径为
output.publicPath + 'style.[chunkhash].css' = '/dist/style.[chunkhash].css'
Окончательный путь доступа к статическому ресурсу можно увидеть в html, упакованном с помощью html-webpack-plugin. такpublicPath
После установки относительного пути относительный путь будет относиться к index.html после сборки, например, если установленоpublicPath: './dist/'
, ссылочный путь упакованного js./dist/main.js
, но здесь есть проблема, относительный путь в порядке при доступе к локальному, но если статический ресурс размещен на CDN, путь доступа явно не может использовать относительный путь, но еслиpublicPath
установлен в/
, путь доступа после упаковкиlocalhost:8080/dist/main.js
, недоступно локально
Так что здесь вам нужно вручную изменить его, когда вы выходите в интернетpublicPath
, это не очень удобно, но я не знаю, как это решить...
В целомpublicPath должен заканчиваться на '/', а другие конфигурации загрузчика или плагина не должны начинаться на '/'
PercingPath в WebPack-dev-сервере
Нажмите, чтобы просмотреть введение в devServer.publicPath в официальной документации.
На этапе разработки мы используем devServer для запуска сервера разработки для разработки, здесь же настраивается сервер разработки.publicPath
,здесьpublicPath
Доступ к упакованным файлам по указанному пути можно получить в браузере. в то время как статические ресурсы все еще используютсяoutput.publicPath
.
Контент, упакованный webpack-dev-server, помещается в память, а внешний корневой каталог этих упакованных ресурсовpublicPath
, другими словами, здесь мы задаем место, где хранятся упакованные ресурсы
Например:
// 假设devServer的publicPath为
const publicPath = '/dist/'
// 则启动devServer后index.html的位置为
const htmlPath = `${pablicPath}index.html`
// 包的位置
cosnt mainJsPath = `${pablicPath}main.js`
Вышеупомянутое может быть напрямую передано черезhttp://lcoalhost:8080/dist/main.js
доступ к.
посетивhttp://localhost:8080/webpack-dev-server
Вы можете получить путь доступа к ресурсу после запуска devServer, как показано на рисунке, нажмите на статический ресурс, чтобы увидеть, что путь доступа к статическому ресурсуhttp://localhost:8080${publicPath}index.html
html-webpack-plugin
Этот плагин используется для добавления css и js в html-шаблоны, гдеtemplate
иfilename
Будет затронут путь, как видно из исходного кода
template
Роль: используется для определения пути к файлу шаблона.
Исходный код:
this.options.template = this.getFullTemplatePath(this.options.template, compiler.context);
следовательноtemplate
Определено только в веб-пакетеcontext
будет распознан ниже.Значение контекста веб-пакета по умолчанию:process.cwd()
, который представляет собой абсолютный путь к папке, в которой была запущена команда node.
filename
Функция: имя выходного HTML-файла, по умолчанию — index.html, которое можно напрямую настроить с подкаталогами.
Исходный код:
this.options.filename = path.relative(compiler.options.output.path, filename);
Таким образом, путь к имени файла относительноoutput.path
, а в webpack-dev-server настраивается относительно webpack-dev-serverpublicPath
.
Если webpack-dev-серверpublicPath
иoutput.publicPath
Непоследовательно, использование html-webpack-plugin может привести к сбою ссылки на статические ресурсы, поскольку devServer по-прежнему заканчиваетсяoutput.publicPath
Ссылка на статические ресурсы не соответствует пути доступа к ресурсу, предоставленному webpack-dev-server, поэтому к нему невозможно получить доступ в обычном режиме.
Есть одно исключение, т.
output.publicPath
это относительный путь, вы можете получить доступ к локальным ресурсам в это время
Так что в целом необходимо убедиться, что devServer вpublicPath
иoutput.publicPath
быть последовательным.
Наконец
О вебпакеpath
Подводя итог, в процессе изучения путей веб-пакетов я увидел некоторые фрагментарные знания о путях:
косая черта/
значение
в конфигурации/
Представляет корневой путь URL, напримерhttp://localhost:8080/dist/js/test.js
серединаhttp://localhost:8080/
devServer.publicPath & devServer.contentBase
- devServer.contentBase сообщает серверу, откуда обслуживать контент. Требуется только в том случае, если вы хотите обслуживать статические файлы.
- devServer.publicPath будет использоваться для определения того, откуда должен обслуживаться пакет, и этот параметр имеет приоритет.
путь в узле
-
__dirname
: всегда возвращает абсолютный путь к папке, в которой находится исполняемый js -
__filename
: всегда возвращает абсолютный путь к выполненному js -
process.cwd()
: всегда возвращает абсолютный путь к папке, в которой была запущена команда node.