如何使用webpack构建Ueditor

栏目: JavaScript · 发布时间: 8年前

内容简介:由于种种原因,我们选择了Ueditor作为我们的富文本编辑器选型。Ueditor不支持模块化,所以无法在代码中使用import去引入。一开始我们在项目中是将Ueditor的js文件直接通过script标签引入,在React的代码里直接使用window.UE去使用编辑器。但是这就有一个问题,我们对UE的源码进行了改动,加入了定制化的功能。而直接引入的UE文件在浏览器是有缓存的,我们每次改动都要清除缓存才能生效。我们要解决缓存这个问题,webpack配置就必须满足以下条件:

由于种种原因,我们选择了Ueditor作为我们的富文本编辑器选型。

Ueditor不支持模块化,所以无法在代码中使用import去引入。一开始我们在项目中是将Ueditor的js文件直接通过script标签引入,在React的代码里直接使用window.UE去使用编辑器。但是这就有一个问题,我们对UE的源码进行了改动,加入了定制化的功能。而直接引入的UE文件在浏览器是有缓存的,我们每次改动都要清除缓存才能生效。

我们要解决缓存这个问题,webpack配置就必须满足以下条件:

  1. 每次改动代码后,能自动给UE的文件名加hash
  2. 能自动插入html模板文件并在主入口文件加载之前加载完成

第一步

为了能让UE的文件进入打包流程,我们将它作为一个新的入口文件

const entry = {
    main: ['babel-polyfill', './src/main.js'],
    ueditor_config: ['./src/common/UEditor/ueditor.config.js'],
    ueditor_all: ['./src/common/UEditor/ueditor.all.js']
};

new HtmlWebpackPlugin({
    template: `./src/app/${key}/templates/${filename}`,
    filename: `../view/${targetHtml}`,
    hash: true,
    chunks: [ueditor_all, ueditor_config, main]
})
复制代码

按上面的配置构建完成之后,会发现效果并不是我们想要的

<script type="text/javascript" src="/public/main.xxxx.js"></script> 
<script type="text/javascript" src="/public/ueditor.config.xxxx.js"></script> 
<script type="text/javascript" src="/public/ueditor.all.xxxx.js"></script>
复制代码

main.js在UE的前面,这样main中使用window.UE就会报错。显然,我们需要一种方式来让这个顺序符合我们的预期。

第二步

HtmlWebpackPlugin的chunksSortMode属性是用来控制插入模板html的script标签的顺序的,默认是auto,会根据webpack给每个chunk生成的id去排序,在entry中排的越前的,id就越小,那在html中就排在前面。所以这里我们第一种解决方案是,调换一下entry顺序

const entry = {
	ueditor_config: ['./src/common/UEditor/ueditor.config.js'],
    ueditor_all: ['./src/common/UEditor/ueditor.all.js']
    main: ['babel-polyfill', './src/main.js']
};
复制代码

但是这个方法有缺陷,当项目中有多个模板html需要引用入口的时候,在entry里面去控制这个 排序 就会遇到冲突的情况,不够灵活。 所以我们把顺序的控制权下方到每个 HtmlWebpackPlugin 中,通过把 chunksSortMode 设置为 manual ,按chunks的顺序去排序,例如

new HtmlWebpackPlugin({
	...
    chunks: [ueditor_config, ueditor_all, main]
})
复制代码

这样,生成的html中srcipt就会是下面的顺序

<script type="text/javascript" src="/public/ueditor.config.xxxx.js"></script> 
<script type="text/javascript" src="/public/ueditor.all.xxxx.js"></script>
<script type="text/javascript" src="/public/main.xxxx.js"></script> 
复制代码

现在看上去顺序是ok了,但是运行的时候,我们发现控制台报错 regeneratorRuntime is not defined

第三步

第二步最后出现的错误,是我们使用的ES6新API没有被转换导致的。由于之前我们只是在main的入口加了babel-polyfill,而main又是在UE的后面加载的,所以导致了报错。所以需要将babel-polyfill放到入口第一个文件

const entry = {
	ueditor_config: ['babel-polyfill', './src/common/UEditor/ueditor.config.js'],
    ueditor_all: ['./src/common/UEditor/ueditor.all.js']
    main: ['./src/main.js']
};
复制代码

继续运行后,第二步的错误已经解决了。不过,新的错误又出现了

TypeError: 'caller', 'callee', and 'arguments' 
properties may not be accessed on strict mode functions or the arguments objects for calls to them
复制代码

第四步

bable会默认给编译的js加上use strict; 严格模式下 callercalleearguments 是不能使用的,追溯到UE的源码中,我们发现里面大量使用了 arguments.callee 这种写法。 直接把源码都改了不现实,所以只能通过配置让bable忽略这个文件。在.babel中我们加入如下配置,

"presets": [
    "react"
 ],
 "ignore": [
     "./src/common/UEditor/ueditor.all.js"
 ],
复制代码

到此webpack就能按照我们的预期构建UE模块了。


以上所述就是小编给大家介绍的《如何使用webpack构建Ueditor》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance JavaScript

High Performance JavaScript

Nicholas C. Zakas / O'Reilly Media / 2010-4-2 / USD 34.99

If you're like most developers, you rely heavily on JavaScript to build interactive and quick-responding web applications. The problem is that all of those lines of JavaScript code can slow down your ......一起来看看 《High Performance JavaScript》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具