如何在浏览器中配置 webpack -libraryTarget + splitChunks + require

2024-02-29

我正在用 JS 为网页编写库,并通过 Webpack“编译”它。我需要在单独的 Webpack 项目中的页面上导入/需要(如 requirejs)这些库。库可以托管在两个单独的路径上 - 一个是相对路径,第二个是绝对路径。我如何配置 webpack 来导出可以在另一个项目中导入/需要的库?

我尝试了 umd、amd、window、this 等libraryTarget,在所有情况下,require 的响应未定义或抛出错误。

我的 libs webpack 配置:

const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

let glob = require('glob'),
    entryObject = glob.sync('./src/js/*.js').reduce(
        function (entries, entry) {
            let matchForRename = /^\.\/src\/(.+)\.js$/g.exec(entry);

            if (matchForRename !== null && typeof matchForRename[1] !== 'undefined') {
                let entryName = matchForRename[1];

                if (typeof entries[entryName] !== 'undefined') {
                    entries[entryName].push(entry);
                } else {
                    entries[entryName] = [entry];
                }

            }

            return entries;
        }, {}
    );

module.exports = env => {
    return {
        devtool: env.production === 'true' ? false : 'eval-source-map',
        target: 'web',
        entry: entryObject,
        output: {
            chunkFilename: '[name].js',
            publicPath: 'dist/',
            libraryTarget: 'umd',
        },
        optimization: {
            splitChunks: {
                chunks: 'all',
                maxInitialRequests: Infinity,
                minSize: 0,
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        name(module) {
                            // get the name. E.g. node_modules/packageName/not/this/part.js
                            // or node_modules/packageName
                            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];

                            // npm package names are URL-safe, but some servers don't like @ symbols
                            return `js/npm/${packageName.replace('@', '')}`;
                        },
                    }
                },
            }
        },
        module: {
            rules: [{
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                },
            }, ]
        },
        plugins: [
            new CleanWebpackPlugin(),
            new CopyWebpackPlugin([{
                from: 'src/php',
                to: 'php'
            }], {
                copyUnmodified: true
            })
        ]
    }
};

在网页项目中我尝试了这样的事情(使用requirejs):

window.require.config({
    baseUrl: '../../libs/',
    paths: {
        prod: 'http://example.com/libs/'
    }
});

window.require(['js/main'], function (main) {
        console.log(main);
    },
    function (err) {
        window.require(['prod/js/main'],
            function (main) {
                console.log(main);
            });
    }
);

或者仅通过 webpack:

import('../../libs/js/main.js').then(function (main) {
            console.log('ok');
        })
        .catch(function (error) {});
    try {
        require(['../../libs/js/main.js'], function (main) {
            console.log(main);
        }, function (error) {});
    } catch (error) {}
    try {
        define('../../libs/js/main.js', [], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}
    try {
        define(['../../libs/js/main.js'], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}
    try {
        define('main', ['../../libs/js/main.js'], function () {
            console.log('ok');
        }, function (error) {
            console.log('error');
        });
    } catch (error) {}

如果我不在 libs webpack conf 中使用优化选项,则 requirejs 工作正常,但如果使用优化 requirejs 返回 undefined :/。

类似问题:
如何配置 webpack - libraryTarget + splitChunks 以在另一个项目中导入块 https://stackoverflow.com/questions/59684261/how-to-config-webpack-librarytarget-splitchunks-to-import-chunks-in-another
具有自己的块依赖项的动态模块导入 https://stackoverflow.com/questions/55413594/dynamic-module-import-with-its-own-chunk-dependencies
导入/加载带块的库 https://stackoverflow.com/questions/48645670/importing-loading-library-with-chunks


None

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

如何在浏览器中配置 webpack -libraryTarget + splitChunks + require 的相关文章

随机推荐

  • 简化具有重复结果的嵌套 if/else?

    我正在尝试简化以下内容 function handleDirection src if src left if inverse tracker else tracker else if inverse tracker else tracke
  • 选择器的“完成”按钮的 Event_Handler

    我有一个包含项目列表的 xamarin 选择器 我想在 iPhone 上按下 完成 按钮和 Android 上按下 确定 按钮时删除选择器 我有删除选择器的代码 但我不知道 event Handler 可能是什么 Code Picker p
  • 安装蓝图时,环境上下文中不允许初始化程序错误

    我正在尝试使用 blueprintjs core我的项目中的库 但是 当我编译代码时 我收到许多这样的错误 node modules blueprintjs core dist common classes d ts 4 30 error
  • C# 中的 XML 多行注释 - 我做错了什么?

    根据本文 http blogs msdn com ansonh archive 2006 09 11 750056 aspx 可以获得多行 XML 注释 而不是使用 use 这是我对多行注释是什么以及我希望发生的情况的解释
  • Visual Studio 2005 清洁解决方案[重复]

    这个问题在这里已经有答案了 如果我有一个包含 10 个项目的解决方案 当我单击 清理解决方案 时 是否只是清理主启动项目解决方案中的 bin debug 或每个项目目录中的 bin debug 它针对当前选定的配置 例如调试 发布等 清理解
  • 在 ng2-select2 中使用 AJAX

    我的 angular2js 项目中有很多下拉菜单 我在用ng2 选择2 https github com NejcZdovc ng2 select2对于这些下拉菜单 在某些下拉列表中 我需要根据用户在 select2 搜索框中输入的字符串来
  • OpenAPI 规范 (YML/YAML):所有 $refs 替换或扩展为其定义(带有模式验证)

    我正在寻找一些解决方案或者一些脚本 可以帮助我通过模式验证替换 ref 或扩展其在 YML 文件中的定义 具体请看下面的例子 示例 使用 ref 输入 pets petId get summary Info for a specific p
  • 识别UIWebview的提交按钮点击

    我有一个带有多个按钮的 UIWebView 页面 需要识别点击的是哪个按钮UIWebView UIWebview加载内容的页面源码
  • 如何获取图片资源

    我应该如何获取imageButton的当前图像资源 我需要这样的东西 imageButton getImageResource 多谢 我认为你不能 当前的 API 不允许这样做 但如果你真的需要这个 你可以这样做 imageButton s
  • 为锦标赛系统分配奖品

    我正在寻找一种将数字分布到 x 个单位的方法 我什至不知道如何表达这个词 所以我举个例子 有一场锦标赛 总奖金为 1000 美元 我希望前 20 名获胜者 参赛者能够从中赢得一些东西 我需要一个数学算法 公式 将其分配给这些玩家 并让我有能
  • 在 Spring Boot 的 application.properties 中使用 env 变量

    我们正在开发一个Spring Boot Web应用程序 我们使用的数据库是MySQL 我们的设置是我们首先测试它locally 意味着我们需要在我们的PC上安装MySQL 然后我们推送到 Bitbucket Jenkins 自动检测到 Bi
  • 如何使 str.splitlines 方法不按十六进制字符分割行?

    我正在尝试使用 str splitlines 解析 GNU Strings 实用程序的输出 这是 GNU Strings 的原始输出 279304 9k pN n 279340 9k PN n 279376 9k
  • Go 语言的 Setter

    抱歉问这个基本问题 我是 Go 语言的新手 我有一个名为的自定义类型ProtectedCustomType我不希望其中的变量是set直接由调用者调用 而想要一个Getter Setter方法来做到这一点 下面是我的ProtectedCust
  • 获得正确的方法来设计复选框,而无需跟随标签标签

    我使用一些 CSS 来重新设计 ASP NET 中的复选框 input type checkbox display none important cursor pointer input type checkbox not disabled
  • 单元测试 REST API

    我在单元测试和模拟方面有一些经验 在我有限的经验中 我会使用这两者来测试服务层 例如 模拟 存根 数据库以消除依赖性并集中于对业务逻辑进行单元测试 现在 我正在创建一个将使用 RESTful Web 服务的包装 API 实现 发回给我的js
  • 如何在 Google Play 中切换语言? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在对 Google Play 进
  • 为什么在单元测试中在$compile(element)(scope)之后调用scope.$digest()

    以下是用于测试指令的非常常见的通用场景 var element scope beforeEach inject function rootScope compile scope rootScope new element angular e
  • Javascript 舍入 v C# 舍入

    我在 ASP NET MVC 中有一个发票页面 我正在计算商品及服务税 在 javascript 中 这是结果 165 45 0 1 16 544999999999998 在 C 中我得到 165 45 0 1 16 545 这些轮次不同
  • 比较两个日期Google Apps脚本

    最好的方法是什么比较两个日期 var int e parameter intlistbox var startDate rSheet getRange parseInt int 1 1 getValues returns Sat Jun 3
  • 如何在浏览器中配置 webpack -libraryTarget + splitChunks + require

    我正在用 JS 为网页编写库 并通过 Webpack 编译 它 我需要在单独的 Webpack 项目中的页面上导入 需要 如 requirejs 这些库 库可以托管在两个单独的路径上 一个是相对路径 第二个是绝对路径 我如何配置 webpa