webpack使用HtmlWebpackPlugin进行cdn配置

作者&投稿:栋狮 (若有异议请与网页底部的电邮联系)
~

在前面的 文章 中我们介绍了cdn的实现原理,现在我们来实现如何在正式开发中使用cdn功能。要使用cdn功能,就需要cdn服务商,我们可以自己搭建,也可以使用一些比较知名的服务商,庆幸的是市面上有不少的免费cdn服务商,如:

其中BootCDN 是 Bootstrap 中文网 支持并维护的前端开源项目免费 CDN 服务,项目资源同步于 cdnjs 仓库。界面相对比较好看,且支持搜索功能,可以在线测试cdn是否正常,所以下面以 Bootcdn 为例说明。

在前段项目开发中,我们经常使用webpack进行项目搭建, 主要作用有两个,分别是

在webpack中使用cdn是在打包生成静态资源的时候做处理,主要原理是使用 html-webpack-plugin 动态插入cdn链接。

关于webpack的使用这里不做过多的介绍,将以vue--cli 2.x生成的默认项目为例做介绍

html-webpack-plugin 是webpack的一个插件,可以动态的创建和编辑html内容,在html中使用 esj语法 可以读取到配置中的参数,简化了html文件的构建。

我们这次主要是使用它来动态插入cdn链接,如link标签和script标签。

在线项目地址

vue-cli 2.x

创建名为 webpack-cdn-demo ,类型为webpack的 vue 项目,如果安装的vue-cli是3.x版本,命令不太一样,详细可看 vue-cli 3 。

安装依赖

启动项目

下面简单介绍一下目录结构

其中build文件夹中的 webpack.prod.conf.js 是我们主要注意的文件,我们在该文件中动态设置不需要被打包的模块并构建出合适的链接。

在webpack项目中,所引入的第三方资源会被统一打包进vender文件中,我们通过webpack的 externals 属性可以设置打包时排除该模块,详情说明见 外部扩展(externals) 。

在前面的步骤中,我们创建的项目包括vue、vue-router,在正式开发在还会有ui库,如element-ui,为了方便演示,我们再安装element-ui和axios两个模块,并实现在构建是把这是个模块以cdn的形式引入。

注意安装时记得 -S ,它的作用是安装完后在 package.json 项目文件中插入记录,后续操作需要读取已安装模块

对于cdn,我们可以自己搭建,也可以使用专业的cdn服务商,这里使用免费的cdn bootcdn 。选用免费cdn有很多好处,但毕竟有隐患,那就是服务有可能会奔溃。

依次搜索出前面模块,结果如下

按照规律,得出cdn资源路径规则为

其他cdn服务商同理

使用cdn其实也就是在webpack热启动和打包项目的时候动态插入script和style链接 ,为了方便维护,我们通过在 build/utils.js 文件上添加几个方法,将来在 webpack.dev.conf.js 和 webpack.prod.conf.js 上可以使用。

如果没有build/utils.js,可以在其他文件上添加,只要在后续步骤中能操作到就行

name 模块名称,与package.json同名
scope 模块作用域命名
js js地址
css css地址

这里特别注意scope,它是webpack配置的external参数下的信息,比如vue的作用域命名是Vue,vue-router的作用域命名是VueRouter,element-ui的作用域命名是ELEMENT,同理,jq的作用域命名是JQuery, 具体做法是先引入该资源,然后在控制台依次输入近似的值,一个个匹配 (目前没找到更好的做法)。

在webpack热启动本地调试的时候,我们可以使用cdn。

在 build/webpack.dev.conf.js 中,默认已经引入了 utils.js ,所以可以直接调用相关方法,如果是自定义的文件,记得引入。

我们可以往里面添加点自定义属性,方便在index.html中调用。 ,修改如下:

其中 cdnConfig 和 onlyCss 自定义属性,在html上通过 htmlWebpackPlugin.options 可以读取到。

更多html-webpack-plugin配置情况官网,这里暂时不需要更多。

在打包的时候,我们使用cdn,配置和前面dev的差不多,只不过需要做多一步。

注意此处的 externalModules ,后面用到,也就是比dev多的步骤。

加入和dev一样的两个配置,不过需要把onlyCss改为 true ,因为我们希望打包时不单单使用css。

webpack配置已经完成,在html-webpack-plugin中已经添加了相关参数,我们再在页面上可以直接使用,使用语法是 ejs ,和asp.net,jsp,php类似。

通过 <% %> 和 htmlWebpackPlugin.options 用js遍历 插入 link标签和script标签。

ps: 修改了webpack配置,需要重启项目才会生效

打包项目

可以看到打包体积大大减小了

页面上也正确引入了cdn资源。

最后奉上git地址: https://gitee.com/zhkumsg/webpack-cdn-demo

比悲伤更悲伤的分割线

原来两年前已经有人做了一个类型的webpack-cdn-plugin




曲水县18241034317: webpack怎么把html搬到输出目录里 -
辛毕醋酸: 首先你需要使用 npm 安装 html-webpack-plugin 插件 你需要生成几个html文件就new 几个 HtmlWebpackPlugin const HtmlWebpackPlugin = require('html-webpack-plugin')/*..... 一大堆配置*/ plugins: [ new ExtractTextPlugin('[name].css'),//这里开始...

曲水县18241034317: webpack怎么打包html -
辛毕醋酸: 1. 打包多个页面的js文件 读取src/views下的目录,约定每一个目录当成一个页面,打包成一个js chunk. 2. 打包多个html 循环生成多个HtmlWebpackPlugin插件,把每一个插件的chunks各自指向上面打包的js chunk.

曲水县18241034317: webpack 能将html打包成js文件吗 -
辛毕醋酸: load是个解析器,webpack只能加载js文件,但是开发vue是,vue文件;图片是png,jsx、json、EXE、等等这些都不是js文件;所以需要load解析器;把他们解析成js格式的文件,这样webpack就能加载处理了

曲水县18241034317: webpack 怎么用里一个webpack.config.js打包 -
辛毕醋酸: 写页面,大概都是这样的结构:index.html css style.css js index.js ...........这样我们的html里直接引用css和js,完成一个网页应用.用webpack也类似,只是webpack把图片、css和js都编译打包成一个文件,我们只需要引用一个文件就可以了.1.我们需要先安装node环境.没安装的请自行安装2.在项目目录下输入npm init初始化一个node项目,输入项目名称等信息,完成后生成一个package.json文件.3.在项目目录下安装webpack.

曲水县18241034317: webpack能配置不压缩指定文件吗 -
辛毕醋酸: 这里说明了,如果单纯使用html-webpack-plugin插件来处理html,那么在此插件下设置minify为false,就不会压缩html文件;但是如果使用了loader与html-webpack-plugin一起处理html,那么html的压缩还受loader的影响.

曲水县18241034317: 为什么webpack不以html文件作为入口 -
辛毕醋酸: webpack不以html文件作为入口,具体的几个原因如下:由于js有现成的模块化解决方案,包括commonjs\AMD\ES6的各种现成方案都可以拿来用,而html并没有成熟的模块化解决方案;html的模块化只有客户端包含和服务器端包含,也就是frameset和shtml可以用来做模块化,但是都不是很合适.

曲水县18241034317: webpack 是怎么处理css -
辛毕醋酸: 他像 Browserify, 但是将你的应用打包为多个文件. 如果你的单页面应用有多个页面, 那么用户只从下载对应页面的代码. 当他么访问到另一个页面, 他们不需要重新下载通用的代码.他在很多地方能替代 Grunt 跟 Gulp 因为他能够编译打包 CSS, 做 CSS 预处理, 编译 JS 方言, 打包图片, 还有其他一些.它支持 AMD 跟 CommonJS, 以及其他一些模块系统, (Angular, ES6). 如果你不知道用什么, 就用 CommonJS.

曲水县18241034317: 如何用webpack打包一个网站应用 -
辛毕醋酸: 随着前端技术的发展,越来越多新名词出现在我们眼前.angularjs、react、gulp、webpack、es6、babel……新技术出现,让我们了解了解用起来吧!今天我来介绍一下如何用webpack打包一个网页应用.一般我们写页面,大概都是这样的结构...

曲水县18241034317: webpack怎么创建配置文件 -
辛毕醋酸: 一.webpack基础1.在项目中生成package.json:在项目根目录中输入npm init,根据提示输入相应信息.(也可以不生成package.json文件,但是package.json是很有用的,所有建议生成) 2.安装webpaack a.在全局中安装webpack:npm install ...

曲水县18241034317: 如何使用webpack,proxy实现前后端分离,并且方便后期前后端联调 -
辛毕醋酸: 分离的痛点是分离后,接口提供不及时,文档不完善,模拟数据不方便等.说一下我们的解决办法:1)webpack设置proxy,这个通过webpack文档或GOOGLE一下可以解决.2)第二步就是需要在后端提供接口及数据和接口文档,而因为前后端...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网