使用 Webpack 2 将 Font Awesome 字体文件打包在单独的目录中
Packaging Font Awesome font files in a separate directory with Webpack 2
我正在尝试在 Cordova 应用程序中使用 Webpack 2 和 Font Awesome。 Cordova 应用程序生成如下文件结构:
app
config.xml
hooks
node_modules
package.json
platforms
plugins
webpack.config.js
www
(这自然包括我的 NPM 文件和 webpack 配置,用于上下文。app
是我存放原始 JSX 源代码的地方)。
www
下的结构(这是编译出的 Web 应用程序应该去的地方),如下所示:
css
fonts
img
index.html
js
我创建了 fonts
目录作为 webpack 配置的目标。我 运行 遇到的问题是,我可以将字体复制到根目录下的某个有用位置,或者我可以使过滤后的 CSS 正确,但不能两者兼而有之。
例如,如果我使用如下示例:
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
loader: "file-loader?name=[name].[ext]&outputPath=www/fonts/&publicPath=/fonts/"
}
文件放在 www
下,但编译后的源代码很奇怪。
@font-face {
font-family: 'FontAwesome';
src: url(/fonts/www/fonts/fontawesome-webfont.eot);
src: url(/fonts/www/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'), url(/fonts/www/fonts/fontawesome-webfont.woff2) format('woff2'), url(/fonts/www/fonts/fontawesome-webfont.woff) format('woff'), url(/fonts/www/fonts/fontawesome-webfont.ttf) format('truetype'), url(/fonts/www/fonts/fontawesome-webfont.svg#fontawesomeregular) format('svg');
font-weight: normal;
font-style: normal;
}
在尝试将字体放置在 www
下时,我还没有找到文件加载器的合适媒介。 and 中的建议对我毫无帮助。
file-loader
中的 outputPath
选项是相对于您的输出目录的,因此将包含在路径中。 publicPath
只是将给定路径添加到已用路径的开头,这基本上意味着输出目录将位于服务器上的其他位置。这会使原始路径保持不变,因为目录中的结构必须保持不变。
要使其按照您的描述工作,您需要更改处理输出目录的方式。正如您已经提到的,您的输出目录是 www
,那是 webpack 应该放置所有内容的地方。因此,将 output.path
配置为 www
.
是有意义的
output: {
path: path.resolve(__dirname, 'www'),
// Other output options
}
有了这个,你不需要在每个输出 name/path 中指定 www
。例如,您可能按照这些行做了一些事情:filename: 'www/bundle.js
,现在变成 filename: 'bundle.js'
。尽管结果相同,但其背后的概念不同,因为您只是告诉 webpack 将输出文件放在哪里,但只有文件名本身与任何处理相关,而输出目录无关。
现在您必须将 file-loader
中的 outputPath
更改为 fonts/
,如果没有 publicPath
,您将得到以下 URL:
url(fonts/fontawesome-webfont.eot);
这是一个相对路径,您可能希望将其设为服务器相对路径。唯一缺少的是前导 /
,因此您将 publicPath
设置为 /
并且您的规则变为(使用更好的 webpack 2 语法而不是内联选项,这使其更易于阅读):
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/',
publicPath: '/'
}
}
您可能希望包含资产的其他加载程序也遵守相同的 public 路径,因此您可以在 output.publicPath
中设置它,而不是为每个加载程序定义它。
output: {
path: path.resolve(__dirname, 'www'),
publicPath: '/',
// Other output options
}
我正在尝试在 Cordova 应用程序中使用 Webpack 2 和 Font Awesome。 Cordova 应用程序生成如下文件结构:
app
config.xml
hooks
node_modules
package.json
platforms
plugins
webpack.config.js
www
(这自然包括我的 NPM 文件和 webpack 配置,用于上下文。app
是我存放原始 JSX 源代码的地方)。
www
下的结构(这是编译出的 Web 应用程序应该去的地方),如下所示:
css
fonts
img
index.html
js
我创建了 fonts
目录作为 webpack 配置的目标。我 运行 遇到的问题是,我可以将字体复制到根目录下的某个有用位置,或者我可以使过滤后的 CSS 正确,但不能两者兼而有之。
例如,如果我使用如下示例:
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
loader: "file-loader?name=[name].[ext]&outputPath=www/fonts/&publicPath=/fonts/"
}
文件放在 www
下,但编译后的源代码很奇怪。
@font-face {
font-family: 'FontAwesome';
src: url(/fonts/www/fonts/fontawesome-webfont.eot);
src: url(/fonts/www/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0) format('embedded-opentype'), url(/fonts/www/fonts/fontawesome-webfont.woff2) format('woff2'), url(/fonts/www/fonts/fontawesome-webfont.woff) format('woff'), url(/fonts/www/fonts/fontawesome-webfont.ttf) format('truetype'), url(/fonts/www/fonts/fontawesome-webfont.svg#fontawesomeregular) format('svg');
font-weight: normal;
font-style: normal;
}
在尝试将字体放置在 www
下时,我还没有找到文件加载器的合适媒介。
file-loader
中的 outputPath
选项是相对于您的输出目录的,因此将包含在路径中。 publicPath
只是将给定路径添加到已用路径的开头,这基本上意味着输出目录将位于服务器上的其他位置。这会使原始路径保持不变,因为目录中的结构必须保持不变。
要使其按照您的描述工作,您需要更改处理输出目录的方式。正如您已经提到的,您的输出目录是 www
,那是 webpack 应该放置所有内容的地方。因此,将 output.path
配置为 www
.
output: {
path: path.resolve(__dirname, 'www'),
// Other output options
}
有了这个,你不需要在每个输出 name/path 中指定 www
。例如,您可能按照这些行做了一些事情:filename: 'www/bundle.js
,现在变成 filename: 'bundle.js'
。尽管结果相同,但其背后的概念不同,因为您只是告诉 webpack 将输出文件放在哪里,但只有文件名本身与任何处理相关,而输出目录无关。
现在您必须将 file-loader
中的 outputPath
更改为 fonts/
,如果没有 publicPath
,您将得到以下 URL:
url(fonts/fontawesome-webfont.eot);
这是一个相对路径,您可能希望将其设为服务器相对路径。唯一缺少的是前导 /
,因此您将 publicPath
设置为 /
并且您的规则变为(使用更好的 webpack 2 语法而不是内联选项,这使其更易于阅读):
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/',
publicPath: '/'
}
}
您可能希望包含资产的其他加载程序也遵守相同的 public 路径,因此您可以在 output.publicPath
中设置它,而不是为每个加载程序定义它。
output: {
path: path.resolve(__dirname, 'www'),
publicPath: '/',
// Other output options
}