webpack4系列教程,如何修改publicPath使用cdn资源?
发布于 作者:苏南大叔 来源:程序如此灵动~基于webpack
的前端项目发展到后期,就是要各种折腾了。这么,折腾的新需求来了,就是静态资源都放到cdn
上面。更变态的需求是:根据文件的不同类型,放到不同的cdn
上面。好吧,要继续修改项目的webpack
配置文件了。
本文测试环境:win10
、node@14.2.0
、npm@6.14.4
、webpack@4.43.0
。主要内容就是:各种花样设置publicPath
。
情况一:单独的资源服务器cdn
修改
因为静态资源涉及到了图片、视频、字体、css
、js
等。一般来说,就设置一个cdn
就够了。把上述这些文件按着目录结构放到cdn
上面就可以了。
这种情况下,就修改output
的publicPath
即可。例如:
module.exports = {
mode: 'production', // 环境
entry: {
//...
},
output: {
//...
publicPath: "//cdn/", //重点
},
module: {
rules: [
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
//...
},
{
test: /\.(eot|woff|woff2?|ttf|svg)$/,
//...
},
{
test: /\.(css|scss|less)$/,
use: [{ loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../',
},
},
//...
],
},
{
test: /\.(png|jpg|gif|jpeg|svg)$/,
//...
},
]
}
}
对于图片、视频、字体等,保持相对路径不变。css
中的publicPath
是用来控制,css
内部的图片及字体引用地址的。内部图片及字体的相对路径,可以定义在name
里面,也可以单独定义name
和outputPath
。css
相关路径,都是相对路径。对于
html
里面的图片及视频地址,因为是使用require
来处理的,其处理机制和css
中的图片不一样。最终将会加载output.publicPath
,就是说cdn
静态资源地址。
最终的效果来看的话:html
里面的资源全部加载了cdn
地址,而css
内部,还是使用相对地址。
情况二:不同资源使用不同的cdn
在情况一中,就涉及到一个cdn
服务器地址,那么,如果需求比较变态,图片、视频、字体、css
+js
,都要放置到不同的cdn
服务器上面呢?
继续看一下苏南大叔的webpack
配置,在这种情况下,所有的地址都不是相对地址了,都是带cdn
地址的绝对地址。配置如下:
module.exports = {
mode: 'production', // 环境
entry: {
//...
},
output: {
//...
publicPath: "//cdn/", //重点
},
module: {
rules: [
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 1024000, //1000kb
name: 'video/[name].[ext]',
publicPath: "//video.cdn/",
esModule: false
}
},
{
test: /\.(eot|woff|woff2?|ttf|svg)$/,
use: [{
loader: "url-loader",
options: {
name: "fonts/[name]-[hash:5].[ext]",
// outputPath: "fonts/",
publicPath: "//font.cdn/",
//...
}
}]
},
{
test: /\.(css|scss|less)$/,
use: [{ loader: MiniCssExtractPlugin.loader,
options: {
//publicPath: '../',
},
},
//...
],
},
{
test: /\.(png|jpg|gif|jpeg|svg)$/,
use: [{
loader: "url-loader",
options: {
name: "[name].[contenthash:5].[ext]",
outputPath: "img",
publicPath: "//img.cdn/",
esModule: false
}
}]
},
]
}
}
- 这里需要注意的是:
css
的MiniCssExtractPlugin
的publicPath
,不是给自己使用的,而是给css
中的图片及字体使用的。而这两者又单独设置了,所以css
相关的MiniCssExtractPlugin
的publicPath
注释掉,然后在图片、视频、字体中,单独设置url-loader
的publicPath
。
特殊说明:url-loader
中的outputPath
另外,对于url-loader
中的outputPath
,单独配置或者写在name
里面,对于真实的目录结构来说,效果是一样的。但是在生成这个cdn
路径上来说,效果是有区别的。最终的访问路径都是:publicPath
+name
。跟outputPath
没有关系,所以,请注意路径配置。
例如,下面的这个配置,生成的路径是://img.cdn/[name].[contenthash:5].[ext]
。
name: "[name].[contenthash:5].[ext]",
outputPath: "img",
publicPath: "//img.cdn/",
下面的这个配置,生成的路径是://font.cdn/fonts/[name]-[hash:5].[ext]
。
name: "fonts/[name]-[hash:5].[ext]",
publicPath: "//font.cdn/",
需要额外提示的是:使用cdn
之后,本地调试就会发生一系列的困难了。所以,请妥善处理cdn
域名的解析和部署问题。
相关链接:
- https://newsn.net/say/webpack-start.html
- https://newsn.net/say/webpack-css.html
- https://newsn.net/say/webpack-font.html
- https://newsn.net/say/webpack-html-loader-ok.html
- https://newsn.net/say/webpack-video.html
总结
本文中,总结了设置cdn
地址的几种情况,在情况二中,css
和js
的publicPath
地址,其实是没有分开。如何解决这个问题,将在后续文章中讲述。更多webpack
经验文字,请点击苏南大叔的博客:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。