什么是CDN
CDN 全称是 Content Delivery Network ,即内容分发网络,是由分布在不同区域的边缘节点服务器群组成的分布式网络。简单的说,CDN 就是将源站的资源缓存到位于全球各地的 CDN 节点上,用户请求资源时,返回最近节点上缓存的资源,而不需要每个用户的请求都从源站获取,从而避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验。

CND加速主要是加速静态资源,如网站上面上传的图片、音视频、流媒体等,以及引入的一些Js、css等文件。
Webpack 中实现CDN
在 Webpack 中接入CDN,需要实现以下几点:
- 导入静态资源的 URL 需要变成指向 CDN 服务器的绝对路径的 URL
- 静态资源的文件名称需要带上有文件内容算出来的 Hash 值,以防止被缓存
- 不同类型的资源放到不同域名的 CDN 服务上去,以防止资源的并行加载被阻塞
下面是实现以上要求的Webpack配置:
const path = require('path');const ExtractTextPlugin = require('extract-text-webpack-plugin');const {WebPlugin} = require('web-webpack-plugin');module.exports = {// 省略 entry 配置...output: {// 给输出的 JavaScript 文件名称加上 Hash 值filename: '[name]_[chunkhash:8].js',path: path.resolve(__dirname, './dist'),// 指定存放 JavaScript 文件的 CDN 目录 URLpublicPath: 'http://js.cdn.com/[hash]/',},module: {rules: [{// 增加对 CSS 文件的支持test: /\.css$/,// 提取出 Chunk 中的 CSS 代码到单独的文件中use: ExtractTextPlugin.extract({// 压缩 CSS 代码use: ['css-loader?minimize'],// 指定存放 CSS 中导入的资源(例如图片)的 CDN 目录 URLpublicPath: '//img.cdn.com/id/'}),},{// 增加对 PNG 文件的支持test: /\.png$/,// 给输出的 PNG 文件名称加上 Hash 值use: ['file-loader?name=[name]_[hash:8].[ext]'],},// 省略其它 Loader 配置...]},plugins: [// 使用 WebPlugin 自动生成 HTMLnew WebPlugin({// HTML 模版文件所在的文件路径template: './template.html',// 输出的 HTML 的文件名称filename: 'index.html',// 指定存放 CSS 文件的 CDN 目录 URLstylePublicPath: '//css.cdn.com/id/',}),new ExtractTextPlugin({// 给输出的 CSS 文件名称加上 Hash 值filename: `[name]_[contenthash:8].css`,}),// 省略代码压缩插件配置...],};
在上面的代码中,通过 publicPath 参数设置存放静态资源的 CDN 目录 URL, 为了让不同类型的资源输出到不同的 CDN,需要分别在:
output.publicPath中设置 JavaScript 的地址css-loader.publicPath中设置被 CSS 导入的资源的的地址WebPlugin.stylePublicPath中设置 CSS 文件的地址
