- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个项目结构,其中包含一个文件夹,当我构建 webpack 配置时,我希望将其动态导入到 UMD 模块中,并使每个文件成为输出构建中的子模块。
例如,假设我的来源如下:
/src/snippets/red.js
/src/snippets/green.js
/src/snippets/blue.js
我希望 webpack 将这些源构建到一个模块中,这样我就可以将每个源作为子模块进行访问,如下所示;
const red = require('snippets').red
我尝试迭代 snippets 目录并创建一个带有文件名和路径的对象,但我无法弄清楚什么配置属性将指示 webpack 将它们捆绑到单个文件中并导出每个文件。这是我到目前为止所拥有的:
const glob = require('glob')
module.exports = {
entry: glob.sync('./src/snippets/*.js').reduce((files, file) => {
files[path.basename(file,'.js')] = file
return files
}, {}),
output: {
path: __dirname + '/lib',
filename: 'snippets.js',
libraryTarget: 'umd'
}
}
出现错误:冲突:多个资源发送到同一文件名 ./lib/snippets.js
知道如何实现我想要的目标吗?
最佳答案
在生产中使用此解决方案的修改版本已经有一段时间了,我没有遇到任何问题。 (我公司的设置有一个稍微复杂的过滤器,以排除某些模拟模块,但在其他方面是相同的)。
我们使用构建脚本来抓取相关目录(在我们的设置中,它是 src
但在您的设置中是 src/snippets
。对于每个以 .在 Node.js 中,我们导入它并在 src/index.js
中重新导出它。如果您需要更强大的东西,例如深入多个级别,您需要修改它以递归遍历目录结构.
完成后,我们将其输出到index.js,并提醒该文件是自动生成的,以阻止人们手动向文件添加条目。
const fs = require("fs");
const { EOL } = require("os");
const path = require("path");
let modules = 0;
const buffer = [
"// auto-generated file", "",
];
const emitModule = file => {
const moduleName = file.replace(".js", "");
modules += 1;
buffer.push(`exports.${moduleName} = require("./snippets/${moduleName}");`);
};
const files = fs.readdirSync(__dirname + "/snippets");
files
.filter(fname => fname !== "index.js" && !fname.startsWith("."))
.forEach(f => {
const stats = fs.statSync(path.join(__dirname, "snippets", f));
if (stats.isFile()) {
emitModule(f);
}
});
fs.writeFileSync(path.join(__dirname, "index.js"), buffer.join(EOL)+EOL);
console.info(`Built 'src/index.js' with ${modules} modules`);
然后,在 webpack.config.js 中,我们将libraryTarget 设置为umd
,如下所示:
module.exports = {
entry: path.resolve(__dirname, "src/index.js"),
output: {
path: path.resolve(__dirname, "build/"),
filename: "mylib.js",
libraryTarget: "umd"
}
};
最后,为了方便起见,在 package.json 中,我们使用以下内容在构建之前自动运行构建脚本(您也可以在启动 webpack-dev-server 或运行 mocha 测试之前使用它)。
这个设置感觉相当老套,但效果很好。我遇到的唯一问题是,模块的顺序偶尔会发生变化(大概是由于环境差异),并且文件的枚举会导致 git 出现误报。
我已将整个包放在 GitHub 上:https://github.com/akatechis/webpack-lib-poc
<小时/>更新:如果您不想通过将构建脚本添加到 package.json scripts
来手动调用构建脚本,您始终可以将其包装为 webpack 插件。您可以阅读详情here
简而言之,插件只是一个具有 apply
方法的对象,该方法将自身注册到 webpack 编译器中。来自文档:
As a clever JavaScript developer you may remember the
Function.prototype.apply
method. Because of this method you can pass any function as plugin (this
will point to the compiler). You can use this style to inline custom plugins in your configuration.
以下是两种设置之间的变化:
更改 webpack 配置以导入构建脚本并将其添加到 plugins
数组中:
const path = require("path");
const buildPlugin = require("./src/index.build");
module.exports = {
entry: path.resolve(__dirname, "src/index.js"),
output: {
path: path.resolve(__dirname, "build/"),
filename: "mylib.js",
libraryTarget: "umd"
},
plugins: [buildPlugin]
};
然后更改 index.build.js
以导出一个在编译器上注册回调的函数(它以 this
形式接收它)。将之前构建脚本的内容放入 build()
函数中,然后导出一个插件函数,如下所示:
module.exports = function () {
this.plugin('run', function(compiler, callback) {
console.log("Build script starting");
build();
callback();
});
};
从 package.json
中的任何脚本中删除 build-index
目标。 Webpack 现在将始终在运行之前调用您的构建脚本。
关于webpack - 使用 webpack 从动态源输出 UMD 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48120264/
我正在尝试使用模块捆绑器 ParcelJS 构建一个模块。我希望这个特定模块对导入友好: 它应该是导入友好的 (ES6) 它应该是友好的(节点) 它应该是 script-src 友好的(浏览器) 它应
按照 Angular 教程,可以看到: 用于https://angular.io/docs/js/latest/guide/forms.html同时, 用于https://angular.io/d
我正在编写一个不可知的日志记录机制,它可以在浏览器和 nodejs 中运行(例如,nodejs 中缺少 console.debug)。 // UMD with no dependencies (fun
假设我有一个像这样的 UMD 模块(保存在 'js/mymodule.js' 中): (function (global, factory) { typeof exports === 'objec
我包含了一个需要 JQuery 2.2 的旧库,但我希望其他所有内容都使用最新版本的 JQuery。有问题的库混合使用 UMD(我认为),所以代码看起来像这样...... (function ($)
我正在定义一个 UMD 风格的模块,定义一个可以跨 CommonJS、AMD 和浏览器全局变量使用的模块,如下所示: (function (root, factory) { if (typeo
我正在创建我的第一个用于开源分发的 AngularJS 模块。我想以其他人易于使用的方式打包它。 UMD 项目提供了一个 pattern用于导出与 AMD、CommonJS(或至少 Node)和浏览器
我的设置 我正在将我的 .ts 模块“FooModule”编译成 UMD module在 Visual Studio 2015 中。我想扩展此 UMD 语法,以便在不存在模块加载系统时将模块作为后备注
我想将我的 React 组件打包为 umd lib。 下面是我的 webpack 设置: module.exports = { devtool: 'eval', entry: [ '.
我刚刚从 2.0.0-rc2 的 Angular QuickStart 跃进,并更新了 system-config.ts 文件来下载 rxjs 的 umd 文件,即 rxjs\bundles\Rx.u
我正在开发一个 javascript 库,它使用闭包编译器来组合/缩小和类型检查。为了避免噘嘴全局命名空间,我想使用 UMD 模式 & closue @export(or goog.exportSym
您好,我正在研究 RxJS。我可以通过在我的浏览器中引用它来简单地使用这个库: 它使用“Rx”的全局对象命名空间变量导入。我可以制作可观察对象并做所有有趣的事情。 当我将 src 更改为指向最新的
我已经安装了 three@^0.103.0,它有自己的类型定义。 在我项目的 src/global.d.ts 中我有: import * as _THREE from 'three' declare
我使用 browserify standalone option在以下 gulp 任务中生成一个 UMD 模块: gulp.task("bundle-source", function () {
我正在 .NET 4.0.30319.18444 上使用 IronPython 2.7.0.40 编写一些代码。在 IronPython 控制台中,如果我对我的模块进行任何更改,它们将不会生效(除非我
我在重写此代码以使其在“严格”模式下工作时遇到问题。由于“this”没有明确定义,我在编译时遇到 jshint 错误。我认为我的大脑没有足够的抽象思维来找到创造性的解决方案。任何帮助,将不胜感激。代码
我是 UMD 和 AMD 新手。我在 Browserify 中编写了一个 JS 库,并且刚刚接触到 UMD。我的理解是,如果我为每个模块都包含一段代码,我的模块应该能够在 CommonJs 和 AMD
我正在尝试加载 gridstack通过 ember-cli 在我的 Ember 应用程序中。我通过 bower 安装应用程序并导入到我的 ember-cli-build.js 文件中。它通过以下方式将
在像下面这样的简单 UMD 设置中,root 和 factory 在哪里/如何定义? (function (root, factory) { // environment detection
我正在尝试找出使用 UMD 工厂测试 Javascript 模块定义的最佳方法,类似于:https://github.com/umdjs/umd/blob/master/returnExportsGl
我是一名优秀的程序员,十分优秀!