Webpack 4 多部分库和子库

2024-01-04

Overview

我正在使用 Webpack4 和 ES6 开发一个名为“共享服务”的 javascript 库,其中包含不同的子文件夹。每个子文件夹代表一个“本地子库”,其中可能包含:

  • 对其他第三个库的引用,例如lodash等,而且还
  • 对其他“子文件夹或子库”的方法的引用

Example

我已经为我的问题做了一个例子并将其推送到github:https://github.com/iarroyo5/multi-part-library-webpack https://github.com/iarroyo5/multi-part-library-webpack。很有帮助的是,它应该像下面一样简单Readme文件以便执行它:)

Issues

  1. 在我的示例中,我将其命名为“共享服务”图书馆作为“多部分库 webpack”。有两个“子文件夹”:api and path。目标是双方sub-folders/sub-libraries可以通过这种方式获得:

    import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api"; import { getUserPath } from '@iarroyo/multi-part-library-webpack/path";

在提供的示例中,我已经实现了我的目标! ...Webpack 输出是 3 个文件:

  1. index.js--> 包含来自的所有方法api and path as apiLib and pathLib
  2. api.js--> 包含api methods
  3. path.js---> 包含path方法和api methods :(

but my 未解决的大问题由此而来^.由于一些方法api正在被进口到path库(每个文件夹必须是sub-library本身并且它们可以在其他文件夹中使用)webpackpath.js文件包含api完全子文件夹。

在示例中path正在使用lodash,但第三个库没有被导出,因为我已将它们添加到externalsWebpack 选项,所以这至少是有效的。

  1. 这并不理想,还有一个大问题:

    import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";

^ 这完全没问题,它返回正确的值,因为这些命名的导入来自api,但是...我也可以这样做:

import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/path";

因为所有方法都来自api在里面path...唯一的区别是这些方法/变量的值是undefined...所以这个解决方案根本不理想,因为有些人可能会尝试使用它methods, variablespath库应该抛出一个异常,例如invalid method...

应用见解

  1. 我尝试过添加每个子文件夹作为外部的,我想也许 Webpack 会认识到它们是彼此的外部......但这没有帮助。

  2. 我已经添加了选项"sideEffects": false为了启用Tree Shaking与 Webpack 4 一起使用,但显然它根本不起作用。我读到关于tree-shaking无法使用以下命令转译代码babel-loader但我不太确定 webpack4 中是否已经解决了这个问题(似乎官方 webpack 发布日志说是......但是!!)。 无论如何,我也将其从webpack-config并尝试了一下tree-shaking也不工作...(我需要babel-loader对于我的最终图书馆,所以这是一个要求)

  3. I've tried with DllPlugin and I've reviewed all the Webpack examples https://github.com/webpack/webpack/tree/master/examples to try to get some fresh ideas, but splitting into chunks files I think is not a solution for ¯this reason: enter image description here

如您所见,使用optimization.splitChunkswebpack4 的选项我有可重用的代码,但问题是当我生成最终的commonjs2我无法访问我的图书馆sub-libraries like

import { API_URL, getApiUrl } from '@iarroyo/multi-part-library-webpack/api";
import { getUserPath } from '@iarroyo/multi-part-library-webpack/path";

这不再起作用了! :(因为现在所有的方法都在commons-index-path.js and commons-api-index-path.j andapi.jsandpath.js` 是缩小的文件,当我尝试访问它们的方法时,它们会抛出此错误:

ReferenceError: window is not defined
    at /Users/inakiarroyo/workspace/spartancode/export-library/dist/index.js:1:1011
    at Object.<anonymous> (/Users/inakiarroyo/workspace/spartancode/export-library/dist/index.js:1:1163)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/inakiarroyo/workspace/spartancode/export-library/dev/es6-lib.js:3:25)
error An unexpected error occurred: "Command failed.

这个帖子使用 webpack 多部分库示例文件时未定义窗口 https://stackoverflow.com/questions/49304790/window-is-not-defined-when-consuming-webpack-multi-part-library-sample-files可能有关系。

我期待 webpack 会保存对我的方法的引用,我将能够使用api.js and path.js,但再次:(

可能的解决方案

  1. 我认为它可行的唯一方法是拥有一个package.json每个“子文件夹”进入"multi-part-library-webpack"运行这些“children-webpack”运行程序以生成每个库,并拥有另一个将用作 webpack 的“parent-webpack”运行程序entry为每个“child-webpack”生成的每个子文件...但说实话,这听起来像是一个混乱的解决方案.

  2. 我想做的事情真的有可能吗Webpack4 ?

  3. 有谁知道这是否可能Rollup https://rollupjs.org/guide/en ?

None

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

Webpack 4 多部分库和子库 的相关文章

  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 为 Angular2 中的组件加载多个样式表

    我正在构建一个 angular2 应用程序 当我尝试为同一组件加载多个样式表时 我面临多个问题 这是我正在做的代码 import Component from angular core Component selector my tag t
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • Cypress 在 Create React App 中返回 .scss 文件的 webpack 编译错误

    我正在尝试将 Cypress 添加到非常基本的 CRA 但遇到了 Cypress 无法理解 scss 文件的问题 当我跑步时npm run cypress运行测试 我收到以下错误 Error Webpack Compilation Erro
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐