使用 Parcel 为浏览器构建 - 如何不输出 CommonJS 或 ES 模块

2024-02-28

我正在尝试编译一个我编写的库,以便可以将分布式文件放入script标记并在浏览器中运行。我正在尝试用 Parcel 2 来做到这一点。我觉得我已经很接近了,但每次我认为我在那里时都会出现一些新问题。

关键是我想要它not捆绑外部依赖项(例如 jQuery),因为它们可能已经存在于将使用此库的站点中。

目标是能够编写包含以下内容的 HTML 文件,并让所有内容正确加载和工作

<script src="/jquery.js"></script>
<script src="/mylib.js"></script>

使用常规构建过程

包裹常规构建(例如parcel build src/mylib.js)将编译后的 JS 输出为 CommonJS,这意味着它有require()里面有函数。这些在浏览器中不起作用。

我正在考虑的一个选项是 RequireJS 或 Browserify 来使 CommonJS 工作,但我真的希望 Parcel 构建只输出我需要的内容。

使用浏览器目标

In package.json:

"targets" : {
    "regular" : {
      "source": "src/mylib.js",
      "context" : "browser",
      "outputFormat" : "global",
      "isLibrary" : false,
      "includeNodeModules" : {
        "jquery": false
      }
    }
}

context and outputFormat尝试强制纯客户端 JavaScript 输出。

在构建时,输出:

@parcel/packager-js: External modules are not supported when building for browser

我添加了includeNodeModules.jQuery=false希望回避这个问题,但没有成功。

包裹服务促进发展

Using parcel serve view/myapp.html构建一个完全在浏览器中运行的应用程序版本。require()被一些 Parcel 内部结构取代(newRequire or parcelRequires我认为)并且它的工作原理与您想要的完全一样。除此之外,它还捆绑了大量 websockets 内容以与 Parcel 内置服务器集成,因此无法分发使用。但很明显,Parcel 只能构建客户端 JavaScript,我只是不明白是什么parcel serve正在幕后做事以获得parcel build命令以同样的方式工作。

这种方法还捆绑了我不希望它这样做的外部组件(即 jQuery),但如果我至少可以获得一个不包含所有 websockets/dev 内容的可分发输出,那么这将是正确的一步方向。

我缺少什么?我想要用 Parcel 做的事情是否可行,或者我是否需要将 CommonJS 转换为浏览器 JS?

谢谢你!

Edit

再多一点实验,又向死胡同迈出了一步:

in package.json我已经指定了不包括 jquery 的生产构建目标:

"targets" : {
    "demo" : {
      "source" : "views/demo.html",
      "includeNodeModules" : {
        "jquery" : false
      }
    }
  },

这构建了一些东西would在浏览器中运行,但其前缀为

import t from"jquery"

如果我设置script tag to type="module"然后这将加载,但无法解析jquery到我在单独的文件中指定的 jquery 版本script标签。也许有一种方法可以告诉脚本模块它的“名称”是jquery?

这仍然不是我想要的,因为我可能无法控制 jqueryscript这个库将使用的标签,我只是希望它接受会有一个$在它可以使用的全局命名空间中。


而不是试图排除jquery从一个"outputFormat": "global"捆绑使用includedNodeModules尝试使用全局别名 https://parceljs.org/features/dependency-resolution/#global-aliases反而:

您的 package.json 可能如下所示:

{
  ...
  "global": "dist/library.global.js",
  "targets": {
    "global": {
      "context": "browser",
      "outputFormat": "global"
    }
  },
  "alias": {
    "jquery": {
      "global": "$"
    }
  },
  "scripts": {
    "watch": "parcel watch src/library.js",
    "build": "parcel build src/library.js",
  },
  "peerDependencies": {
    "jquery": "^3.6.0"
  },
  "devDependencies": {
    "parcel": "2.0.0-rc.0",
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Parcel 为浏览器构建 - 如何不输出 CommonJS 或 ES 模块 的相关文章

  • 在 ExpressJS 中通过管道传送远程文件

    我想读取远程图像并显示它 我可以保存文件 但无法正确显示代码 理想情况下 我只想直接传递文件而不进行处理 不确定是否需要 tmp 文件步骤 此代码不显示任何内容 没有错误 我也尝试了 res pipe response var url ht
  • 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

    我使用 VB6 创建了一个 ActiveX dll 并使用打包和部署向导将其打包 生成了一个 cab 文件和一个演示 HTML 页面 此 ActiveX dll 包含一个 simgle 方法 该方法返回字符串且不接受任何参数 我遇到的麻烦是
  • 在 HTML SELECT 标记中禁用键盘

    我想禁用 HTML SELECT 标记的键盘 以便用户只能使用鼠标来选择选项 我试过了event cancelBubble true on the onkeydown onkeyup and onkeypress没有运气的事件 有任何想法吗
  • 这个特定的 ReactJs 代码是如何执行的初学者问题?

    我是初学者 正在阅读大量代码 现在我想知道下面的代码我明白这段代码在做什么 我需要澄清的是代码流程 当我运行它时 我看到图像正在加载 React 是从上到下执行代码吗 占位符图像异步获得正确的图像 但会App如果需要时间 组件会开始渲染但没
  • 了解执行模型和事件循环

    我读过很多关于JavaScript单线程执行模型 事件循环和事件队列的文章 但有一件事尚不清楚 我创建了一个小提琴来说明我的问题 http jsfiddle net yzpmf67f http jsfiddle net yzpmf67f
  • 如何使用 jquery 从 iframe 内部滚动?

    我正在使用一个 Shadowbox 它生成一个 iframe 以在页面上显示产品详细信息 由于详细信息页面可能相当长 因此客户端需要一个 更多 按钮来向下滚动页面 显然 iframe 右侧的滚动条还不够 这是我为了让 iframe 滚动而尝
  • Chart.js 没有显示在我的视图中

    我有一个使用 angular js 运行的应用程序 我的视图之一应该加载图表 我正在使用 Chart js 但由于某种原因它不起作用 并且我的控制台上没有显示错误 这是我创建图表的函数 scope writeBatteryChart fun
  • 通过单击字段启用非活动字段

    是否可以有一组非活动字段 如果单击其中一个字段 则某些字段将变为必填字段并运行某些代码段 举例来说 您显示了三个字段
  • Angular 2 最终版本路由器单元测试

    如何使用 karma 和 jasmine 对 Angular 2 0 0 版中的路由器进行单元测试 这是我的旧单元测试在版本 2 0 0 beta 14 中的样子 import it inject injectAsync beforeEac
  • 嵌套对象的 AJV 模式验证

    函数返回的对象看起来像这样 answer vehicle type 1 message Car model VW color red 答案 对象始终存在 其他字段基于 vehicle type E g 如果vehicle type 1 则有
  • 向 FTP 服务器执行跨域 XMLHTTPREQUEST 的语法是什么?

    我有一个 webDav CORS 插件 可以使用它在 webDav 服务器上 POST PUT GET REMOVE ALLDOCS 文件 我现在想对 FTP 做同样的事情 但我正在努力获取xmlhttprequest 工作语法 我只是收到
  • 如何获取调用函数的“this”值?

    如果我有一个这样的函数 function foo this console log this function bar bar prototype func function foo this var test new bar test f
  • Node.js 和 Express:异步操作后如何返回响应

    我是 Node js 新手 所以我仍然对异步函数和回调很感兴趣 我现在的难题是如何在异步操作中从文件读取数据后返回响应 我的理解是发送回复的工作方式如下 这对我有用 app get search function req res res s
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF
  • 在javascript中定义Date.parse的格式[重复]

    这个问题在这里已经有答案了 我正在使用 Date parse 将字符串转换为 JavaScript 中的日期 但是 如果字符串看起来像 10 11 2016 它会被解释为 2016 年 10 月 11 日 我需要将其解释为 2016 年 1
  • 条件顺序仅在 init AngularJS 上执行

    如何在视图初始化时仅运行 orderBy 过滤器一次 我不希望我的列表在运行时被重新排序 li li 使用 orderBy 作为控制器中的过滤器 app controller DemoCtrl scope filter function s
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • JS中如何过滤多个字符串? [复制]

    这个问题在这里已经有答案了 我希望能够过滤数组中的多个字符串 类型 例如我想过滤类型meat并输入fruit在下面的数据结构中 我想要实现的是过滤数据对象 const data type meat food hamburger type f

随机推荐

  • NSIncation 和 block 有什么区别?

    当我说阻止时 我的意思是 int a return a a 另外 block仅支持iOS4及以上版本 这两者有什么区别 An NSInvocation是一条发送给对象的消息 使用选择器 带有可选参数 可以稍后 或现在 执行 并且在当前上下文
  • 更改 Nestjs 中的 dist 目录

    我正在构建一个基于 Nestjs 的 API 这main ts文件嵌套在 my 的子文件夹中src目录 结果 编译后的文件也嵌套在dist目录和我的入口点是dist api main js代替dist main js 我希望保持这种状态 当
  • 强制 SHBrowseForFolder() 显示所需的目录

    我已经在网上搜索并与这件事斗争了一个多小时 但似乎仍然无法让它发挥作用 大多数人在论坛等上看到这里时似乎很满意 但我的仍然不起作用 我试图强制 SHBrowseForFolder 函数在我选择的文件夹中启动 char current MAX
  • 强制另存为,MS Excel VBA

    我对 MS Office 产品中的 VBA 有点陌生 我一直在寻找一些代码 这些代码将强制用户 另存为 我用作模板的 xls 文件 但它不是实际的模板文件类型 基本上 我有这个 用户打开 xls 在某个字段中输入一些数据 然后文件 gt 另
  • 具有动态参数的表达式树

    我想转换这个 Func
  • 在 try catch 中访问变量

    我在返回 menuFont 行上不断收到编译错误 它表示没有变量 menuFont 有人可以告诉我如何解决这个问题吗 import java awt Font import java awt FontFormatException impo
  • 发送电子邮件的代码

    我在这里做错了什么 private void SendMail string from string body string mailServerName plus pop mail yahoo com MailMessage messag
  • 删除字符串中的空格

    我必须摆脱超过 1 个空格也就是说 如果有超过 1 个空格 我会将其替换为单个空格 这就是我的做法 但我真的很困惑哪种方法是最好的方法以及所有这些方法有什么区别 下面是我的代码 public class SspaceDemo public
  • 已弃用的 API 和旧版 API 之间的区别?

    我正在研究 Java 中的遗留 APICollection Framework我了解到诸如此类的课程Vector and HashTable已被取代ArrayList and HashMap 然而 它们仍然没有被弃用 并且被视为遗留 本质上
  • WordPress 的 Docker 运行缓慢

    Problem 我在使用 WordPress 和 Docker 时遇到问题 因为我的网站加载时间很慢 7 秒 我不确定为什么会发生这种情况 但我认为这与外部数据库或共享卷有关 Setup 我有一个使用 XDebug 和 Mailhog 在
  • C++ - 如何找到整数的长度

    我试图找到一种方法来查找整数的长度 位数 然后将其放入整数数组中 该作业还要求在不使用 STL 中的类的情况下执行此操作 尽管程序规范确实说我们可以使用 通用 C 库 我会问我的教授是否可以使用 cmath 因为我假设 log10 num
  • salesforce 中的联合身份验证和委派身份验证

    有人知道 salesforce 中的联合身份验证和委托身份验证之间的区别吗 您能解释一下这两种方法中的请求流程吗 主要区别在于联合身份验证上安全断言标记语言 SAML 的使用 委托认证如果您的组织中有移动用户 或者您想要启用委派身份验证 单
  • 如何判断我的应用程序是否从后台恢复?

    我想在应用程序进入后台时锁定它 当它恢复时我想显示我自己的锁定屏幕 锁屏是我的应用程序的一个活动 成功输入密码后 用户可以看到恢复的 Activity 否则他不能 我怎样才能做到这一点 主要问题是 当你开始一个项目时 你必须得到一个特定的行
  • 如何在 Django 中将两个模型字段表示为一个表单字段?

    我似乎无法弄清楚如何在 Django 中正确处理以下情况 我在模型中有一个日期范围 我将其存储为两个单独的字段 date start and date end start date models DateTimeField end date
  • 如何解决 C++ 中友元声明的循环依赖?

    为什么以下代码无法编译以及如何修复它 我得到的错误是 使用未声明的标识符 Foo 虽然Foo在错误发生的地方 在friend声明于Bar foo h ifndef FOO H define FOO H include bar h neede
  • 使用位掩码组合枚举值

    我知道可以在枚举值中使用位掩码 但我不知道如何创建它 我有一个简单的枚举 enum State minimizing 0 maximizing minimized maximized 状态总是State minimized or State
  • 在同一行初始化两个变量

    我很难找到这个概念的权威例子或讨论 如果我的 Ruby 方法中有 2 个数字变量 我需要将它们初始化为零 它们将用作计数器 这可以吗 安全吗 它在我的测试中有效 而不是这个 foo 0 bar 0 你可以这样做 foo bar 0 这似乎是
  • 了解Android联系人的架构

    我正在开发一个 Android 应用程序 它需要知道何时添加 更新 删除联系人 所以我读了几篇文章 据我所知 每当联系人发生更改时 我们都可以通过内容观察者收到通知 但我们无法获取已添加 更新 删除的联系人 因此 我阅读了官方 API 并准
  • 来自 API 的 2 个并发请求数据混淆

    我使用 Nodejs 作为我的应用程序 API 的后端 但我意识到当有 2 个不同的用户不断请求同一个方法时 从 MySQL 请求返 回的数据有时可能会混淆 这是我的代码 router get v1 getList function req
  • 使用 Parcel 为浏览器构建 - 如何不输出 CommonJS 或 ES 模块

    我正在尝试编译一个我编写的库 以便可以将分布式文件放入script标记并在浏览器中运行 我正在尝试用 Parcel 2 来做到这一点 我觉得我已经很接近了 但每次我认为我在那里时都会出现一些新问题 关键是我想要它not捆绑外部依赖项 例如