【问题标题】:Webpack output UMD library with CamelCase and spinal-case nameWebpack 输出带有 CamelCase 和脊柱案例名称的 UMD 库
【发布时间】:2017-01-23 16:50:52
【问题描述】:

如何配置 Webpack 以创建 UMD 包,以便 AMD 和 CommonJS 的包名称以小写(脊柱大小写)命名,而全局上下文的包名称将具有 CamelCase 名称?

例如,我希望我的捆绑包以

开头
(function webpackUniversalModuleDefinition(root, factory) {
    if(typeof exports === 'object' && typeof module === 'object')
        module.exports = factory(require("dependency"));
    else if(typeof define === 'function' && define.amd)
        define("my-library", ["dependency"], factory);           // spinal-case
    else if(typeof exports === 'object')
        exports["my-library"] = factory(require("dependency"));  // spinal-case
    else
        root["MyLibrary"] = factory(root["dependency"]);         // CamelCase
})...

这是它在 ReactDOM 中的样子:

(function(f) {
  // CommonJS
  if (typeof exports === "object" && typeof module !== "undefined") {
    module.exports = f(require('react'));

  // RequireJS
  } else if (typeof define === "function" && define.amd) {
    define(['react'], f);

  // <script>
  } else {
    var g;
    if (typeof window !== "undefined") {
      g = window;
    } else if (typeof global !== "undefined") {
      g = global;
    } else if (typeof self !== "undefined") {
      g = self;
    } else {
      // works providing we're not in "use strict";
      // needed for Java 8 Nashorn
      // see https://github.com/facebook/react/issues/3037
      g = this;
    }
    g.ReactDOM = f(g.React);
  }
})(function(React)...

【问题讨论】:

    标签: javascript webpack umd


    【解决方案1】:

    您还应该将属性umdNamedDefine 设置为true。这就是我的 output 块在我执行 UMD 包装库时通常的样子。我将使用我目前拥有的 npm 包中的一个示例,因为它将是最能说明问题的:

    output: {
        path: './lib',
        filename: 'dom-regex.js',
        library: 'DomRegex',
        libraryTarget: 'umd',
        umdNamedDefine: true
    },
    

    鉴于我的 npm 包在 package.json 中被命名为 dom-regex,这允许我通过以下方式使用我的包:

    ES6:

    import DomRegex from 'dom-regex';
    

    RequireJS

    var DomRegex = require('dom-regex');
    

    在窗口上:(如果文件直接暴露在窗口中)

    window.DomRegex
    

    在 UMD 包装部分中导出的名称不如导入时的名称重要。以dom-regex 为例,即使我在我的项目中(不是在node_modules 中)本地拥有它,并且文件名是dom-regex.js,我仍然可以执行所有前面的示例,因为它是UMD 包装的:

    欢迎您探索repo for dom-regex 并测试下载包以了解其工作原理。

    【讨论】:

    • 举个例子,当你使用 ES6 时,你会这样做 import ReactDOM from 'react-dom;', var ReactDOM = require('react');'使用 RequireJS 并且简单地将脚本添加到文件时,您只需调用 ReactDOM (window.ReactDOM)。请参阅 ReactJS 捆绑包npmcdn.com/react-dom@15.4.2/dist/react-dom.js
    • @AlexanderShutov,我已经用一个更好的例子更新了我的答案,以及一个你可以探索/试验的回购。
    • 最后为了得到我需要的东西,我不得不删除umdDefineName,这样 AMD 和 CommonJS 部分就没有名字了。由于某种原因,CommonJS 被 Webpack 留下了,但幸运的是在 Webpack 或 Rollup 中导入时被忽略了。最后,看,how React team do it
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多