- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一个 plugin for leaflet ( npm package ),我希望它可以作为 ES6 导入或作为 HTML header 中的脚本使用。
例如,我希望这两个都是可能的:
// As an npm package
import 'leaflet-arrowheads'
// From your HTML header
<script type="text/javascript" src="./leaflet.arrowheads.js"></sript>
我的插件有一个依赖项,leaflet geometryutil .所以代码看起来像这样:
import 'leaflet.geometryutil'
L.Polyline.include({
...my plugin code here
})
L.LayerGroup.include({
... a bit more code here
})
这在使用 ES6 模块时有效,其中 leaflet.geometryutil
作为我的包的依赖项安装。但是当用在 HTML 文件的头部时,这显然是行不通的。 (当然,任何试图这样做的人都必须在我的插件之前的某个地方在他们的标题中有 leaflet.geometryutil 脚本 - 这在我的 github 自述文件中有清楚的解释。)
我目前的策略是只拥有 2 个 github 分支 - one with the import statement , 和 one without .但我试图了解我可以做些什么来合并这两个分支,并拥有一段适用于两种情况的代码。到目前为止,我的 2 个想法是:
如果 geometryutil
模块不在 Leaflet 命名空间中,则只导入它:
if(!L.GeometryUtil){
import('leaflet-geometryutil')
.then( GeometryUtil => {
console.log('all good')
})
.catch( err => throw(err) )
}
L.Polyline.include({ ..plugin code... })
这是行不通的,因为 import
promise 在我的 L.Polyline.include
代码运行后才会返回,所以 GeometryUtil< 的任何使用
在我的代码中返回一个未定义的 GeometryUtil
。这适用于 HTML header 场景,其中作者在我的插件标签之前有一个 GeometryUtil
脚本标签,因为 if
语句返回 false 并且导入 promise 未执行。
是否有另一种方法可以编写动态导入语句,以便插件代码仅在导入 promise 完成后运行,然后正确导入到插件用户正在编写的另一个模块中?
看来我可以用 webpack 来实现我的目标。基于关于 authoring libraries 的 webpack 文档,我可以做类似的事情
output: {
path: './dist',
filename: 'leaflet.arrowheads.js',
library: 'arrowheads',
libraryTarget:'umd'
}
但我不太确定如何准确配置输出。文档解释说这将公开一个全局变量 arrowheads
,但这不是我们所需要的。我正在构建的插件并没有真正公开一个新变量,而是添加到现有的传单库中。
我如何配置 webpack.config 来构建插件,以便它 1: 可作为导入使用(它本身导入其依赖项 leaflet.geometryutil),还有 2: 可作为 HTML header 中的脚本标记使用,它会按预期自动更改传单对象 L
?
还有我没有想到的第三种选择吗?
感谢阅读。
最佳答案
这是前端库的一个常见难题。
webpack确实可以提供一些解决方案,Rollup也是如此(这是Leaflet使用的构建引擎)。
至于动态导入,当你构建一个应用程序并由你的构建引擎管理动态导入时它工作正常,但我不会在编写库时依赖它,因为你不知道环境/构建是否消费者项目使用的引擎将支持它。
在您的情况下,您甚至可以省去使用构建引擎和尝试正确配置它的麻烦。
首先,您正确地注意到(并遵循了 Leaflet 约定)大多数 Leaflet 插件不会将任何内容导出到全局范围或导入器,但会产生在 Leaflet 的 L
命名空间。因此,在使用构建引擎导入程序时,我们只需要做:
import "leaflet";
import "leaflet-arrowheads"; // nothing in curly braces
因此您的库甚至不需要导出任何东西(即您可以在 L.Polyline.include
之前去掉 export default
)。
您现在可能开始看到一个可能的解决方案:为导入和 HTML 脚本创建一个通用文件,只包含您的 L.Polyline.include
代码;有一个单独的导入条目文件(即您在 package.json/main
中引用的内容,它导入您的依赖项和您的公共(public)文件。顺便说一句,您甚至可以在该文件中导入 Leaflet!
package.json
{
"main": "index.js" // npm convention, not even needed if your file is named "index.js"
}
index.js
import "leaflet";
import "leaflet.geometryutil";
import "./src/leaflet-arrowheads.js"; // common file
src/leaflet-arrowheads.js
L.Polyline.include() // etc.
然后你有一个单一的公共(public)文件来维护,不需要使用单独的分支,一切都发布到 npm,即免费的 CDN(如 unpkg、cdnjs 和 jsDelivr)将能够直接提供你的公共(public)文件,准备好HTML 脚本消费!
最后要担心的是您的依赖项:在节点样式导入的情况下,这很好,因为您的包将其列为依赖项,因此它将与您的包一起安装,并且您将其正确地导入到索引文件中。
但对于 HTML 脚本,您仍然需要“手动”导入依赖项,即您仍然需要告诉库的用户在他们的 HTML 脚本中包含依赖项。
这可以通过将依赖项与您的插件捆绑在一起来避免,通常是现在引入构建引擎。在这种情况下,通常的做法是构建多个版本: 1 已经捆绑了所有依赖项,因此您的库用户只需要 1 个导入; 1 只有你的代码,让你的库用户管理依赖项的导入(通常这样他们就可以控制版本,也可以直接使用它们而无需重复代码等)。为此,上面的索引文件也用作构建入口点。然后你必须指定不包含在包中的内容:排除 Leaflet,可能还有 Leaflet-geometryUtil。
关于javascript - 使传单插件可作为导入或直接从 html header 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60105355/
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在寻找有关如何构建可扩展 WCF 服务器(具有动态加载的服务)的建议,最好使用 System.Addins 或 MEF。 服务器应托管实现最小“插件”API(StartService/StopSe
有没有一种方法可以使用加载浏览器扩展/插件/插件的 headless 浏览器(即 PhantomJS、Selenium)来运行自动测试? 更具体地说,我想模拟广告拦截器(如 Ghostery、ad-b
我是 gradle 的新手,我使用 artifactory 作为我的 repo 服务器。我在网上查看了如何将我的项目发布到我的 repo 服务器,发现我可以使用 maven-publish 或使用 a
我想禁用某些状态的点击/事件,并仅使少数状态可点击。我通读了http://newsignature.github.io/us-map/处的文档,并且找不到与此问题相关的任何内容。 最佳答案 http:
据我了解,在Intellij中使用idea插件打开Maven构建的项目并不是最好的方法,即调用: mvn idea:idea 但是直接打开pom文件(Intellij有默认的Maven插件);同样的事
使用Artifactory plugin对于 Jenkins pipeline 来说是一种幸福,只要遵循文档就可以了。但后来我介绍了Maven Flatten plugin解析父模块和子模块 mvn
我已经安装了Elasticsearch版本1.7.1。一切正常。我也安装了 JDBC 驱动程序。检查下面我的插件文件夹 目录E:\Xampp\htdocs\my-elastic\elasticsear
在我使用 webpack common chunks 插件创建包含第三方库(如 angular、react、lodash 等)的 vendor 包之前,但后来我知道了 webpack dll
我们正在尝试使用(Jenkins、sonar、eclipse ...)安装 CI 平台。 为了让每个开发人员都可以在提交之前对他的代码进行分析,我想知道两种选择: 使用 Sonar 插件运行本地分析。
我知道这是一个比较特殊的问题。尽管如此,也许有些人知道这一点: 我想在 Eclipse 中使用 Maven 编译 Hector=> 分支:0.7.0 和标签:hector-0.7.0-29(https
我卡住了。我一直在尝试寻找或自己创建一个简单的准系统示例,说明如何为 VS 2010 Express 创建 Outlook 插件。我知道这在 VS 2010 Pro 中更简单,但是,在快速版本中真的不
我有以下排除过滤器来忽略所有 R 文件类: findbugs-exclude-filter.xml 当我将它用于 FindBugs-IDEA 插件时,它可以
我刚开始玩 CakePHP,我发现了 Wildflower CMS .我喜欢这个想法,并打算开始修补它。不过,我有一个问题。 在自述文件中,我发现了以下内容:“Wildflower 不是也不会是 Ca
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件
本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,V
Maven – 插件 什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来: 创建 jar 文件 创建 war
我正在编写一个插件来添加带有标签 [deposit_page] 的页面;该标记应替换为一些 PHP 代码。 这就是我所拥有的,但它不起作用。有什么我遗漏或做错了什么吗? function deposi
我是一名优秀的程序员,十分优秀!