Build 使用CommonJS模块和ES6模块编译单独应用程序的目录树(每个应用程序有一个入口点)

Build 使用CommonJS模块和ES6模块编译单独应用程序的目录树(每个应用程序有一个入口点),build,couchdb,ecmascript-6,commonjs,Build,Couchdb,Ecmascript 6,Commonjs,我正在写一封信。构建过程的输出必须是自包含JS文件的目录树,如下所示: dist ├── _attachments │ ├── logo.jpg │ └── splash.jpg ├── lists │ └── sitemap.js ├── shows │   ├── article.js │ ├── home.js │ └── dashboard.js ├── views │   ├── recent │   │ └── map.js │ ├── featured

我正在写一封信。构建过程的输出必须是自包含JS文件的目录树,如下所示:

dist ├── _attachments │ ├── logo.jpg │ └── splash.jpg ├── lists │ └── sitemap.js ├── shows │   ├── article.js │ ├── home.js │ └── dashboard.js ├── views │   ├── recent │   │ └── map.js │ ├── featured │ │ └── map.js │ └── stats │ └── map.js │ └── reduce.js 距离 ├── _附件 │ ├── logo.jpg │ └── splash.jpg ├── 列表 │ └── sitemap.js ├── 显示 │   ├── article.js │ ├── home.js │ └── dashboard.js ├── 意见 │   ├── 最近的 │   │ └── map.js │ ├── 作为特色的 │ │ └── map.js │ └── 统计数据 │ └── map.js │ └── reduce.js 每个输出JS文件都是一个完整的应用程序,所有导入的模块都是内联的。每个输入文件都是一个单独的入口点,需要从顶级
lib
目录(和
node\u模块
或课程)导入模块。然后将生成的
dist
目录部署到coach by(欢迎其他建议)

到目前为止,我已经尝试了以下方法:

  • 用巴贝尔(ES7耶!)编译,使用西兰花。使用CommonJS require语句生成ES5模块;需要进一步的构建步骤来内联导入的模块
  • 从命令行浏览和丑化。看起来这只是为了生成一个输出文件而设计的
  • 在makefile中,分别放大每个输入,并将输出发送到
    dist
    下的匹配目录路径。正在进行的工作,但不是理想的解决方案
所以,我要回到makefile。它们以一种异国情调的方式很漂亮,但我真的想坚持使用基于现代/JS的构建过程——比如西兰花或大口大口(或其他什么)。建议

更新


我看到Webpack可以为多个入口点构建多个输出文件。但是它能保留输入目录结构吗?

Makefiles就是这样。我怀疑这在Linux开发机器之外的任何机器上都能工作。如果你发布的东西是供其他人使用的,不要这样做

这样做的目的是从
src
树中的每个设计文档构建一个独立的应用程序。show文档使用React以同构样式呈现页面,其重量为数兆字节

为了让CouchDB能够执行其中一个应用程序,输出JS必须计算为实现CouchDB API相关部分的全局函数声明。为此,我构建了一个独立的UMD模块,该模块将其输出附加到一个
全局
对象(如果存在的话)。CouchDB中不存在一个声明,因此我们在声明前加上一个表达式,该表达式对模块导出的函数求值:

echo 'global={};' > $(BUILD_DIR)/$*.js
$(BUILD_CMD) --standalone func $(SRC_DIR)/$*.js >> $(BUILD_DIR)/$*.js
echo 'global.func;' >> $(BUILD_DIR)/$*.js
以下是整个文件:

SRC\u DIR=SRC
BUILD\u DIR=BUILD
SRC:=$(shell查找$(SRC_DIR)-类型f-打印)
JS:=$(过滤器%.JS,$(SRC:SRC/%=%)
静态:=$(过滤掉$(JS),$(SRC:SRC/%=%)
BUILD_CMD=browserify-t babelify-g[uglifyify-c-m]
BUILD_DEV_FLAGS=--监视
全部:地区
#使用Erica部署到本地CouchDB
#TODO:浏览器重新加载
安装:$(addprefix$(BUILD\u DIR)/,$(JS))复制
cd$(构建目录)和erica push couchra-v
复制:$(addprefix$(BUILD\u DIR)/,$(静态))
#将JS从./src传输到./build
$(构建目录)/%.js:$(SRC目录)/%.js
mkdir-p$(dir$(BUILD\u dir)/$*)
echo'global={};'>$(BUILD_DIR)/$*.js
$(BUILD\u CMD)--独立函数$(SRC\u DIR)/$*.js>>$(BUILD\u DIR)/$*.js
echo'global.func;'>>$(BUILD_DIR)/$*.js
#将静态文件从./src复制到./build
$(静态:%=$(构建目录)/%):$(静态:%=$(SRC目录)/%)$(构建目录)
mkdir-p$(dir$@)
cp$(@:$(构建目录)/%=$(SRC目录)/%)$@
$(构建目录):
mkdir-p$(构建目录)
清洁:
rm-Rf$(构建目录)
.冒牌货:清洁区
很可能在某个时候,我会将其转换为纯shell脚本,并运行它们

有待改进的领域:

  • 从构建中排除常用的lib,并使用CouchDB的CommonJS功能包含它们。这将使设计文档的大小减少一半以上,并允许coach在加载设计文档以处理请求时避免大量磁盘读取
  • 将渲染代码移出“显示”函数,移到“更新过滤器”中。这样,每次更新可以创建一次HTML视图,而不是每次写入。每个文档将在
    renderedViews
    成员中包含其自身的几个呈现版本。Show和list函数将返回或连接并返回此静态标记,这将从服务器端呈现页面的响应时间中消除React应用程序的执行时间

如果我正确理解您的问题,您希望内联要求js模块在脚本中提供这些模块。是这样吗?您可以这样做,但不需要这样做,因为couchdb支持需要js。这意味着您可以执行
var my_lib=require(“某些库的路径”)
,它将与couchdb一起工作。好的,那么我只需要将ES6和CommonJS模块转换为RequireJS模块。你有关于CouchDB模块加载功能的文档链接吗?除了一些基于评论中元数据的自定义方案(kanso),我什么都找不到。我发现非常有用。但是希望这有帮助:)