我使用grunt-urequire插件将我的project-1模块编译成单个文件(让我们称之为project-1.js
)。 Config看起来像这样:
urequire: {
umd: {
template: 'UMD',
path: 'src',
dstPath: 'dist/umd'
},
dev: {
template: 'combined',
path: 'src',
main: 'Main',
dstPath: 'dist/<%= pkg.name %>-<%= pkg.version %>.js'
},
min: {
derive: ['dev', '_defaults'],
dstPath: 'dist/<%= pkg.name %>-<%= pkg.version %>.min.js',
optimize: 'uglify2'
},
_defaults: {
useStrict: true,
noConflict: true,
bundle: {
dependencies: {
exports: {
root: {
'Main': 'Project1'
}
}
}
}
}
}
Project-1依赖于project-2,它也由grunt-urequire管理。在package.json
:
"devDependencies": {
"project2": "^0.1",
...
}
现在我想在构建中将项目2依赖项嵌入到项目-1中,以便可以执行
<script src="project-1.js"></script>
在浏览器中,不要手动包含项目-2。
我知道browserify支持此功能,但我可以使用urequire吗?
答案 0 :(得分:1)
如果您想在同一个git存储库上对2个项目进行版本化,因为它们一起更新并具有相同的发布生命周期,您可以将构建脚本分为两部分:
在编译project2期间,您可以将project2的分布式JS复制到project1 / src中,以便自动生成。
如果您有不同的发布生命周期,您可以使用一些grunt工具从CDN / NPM下载依赖项,并在打包项目1之前将其放入project1 / src文件夹中
这是Browserify通过使用NPM所完成的工作,但是下载依赖项可能与Bower,组件或自定义JS代码相同。我建议使用像NPM这样的工具,因为它也下载了传递依赖项(如果有一天project2引入了依赖项,你将不必触及project1构建......)
最后,我不知道你的需求,但也许你可能会受到this project的启发,它会在打包版本中嵌入依赖关系(eventie)
答案 1 :(得分:1)
uRequire没有将外部依赖项(如jquery
,underscore
等)嵌入到combined.js
文件中,这与browserify不同,这是唯一的选择(据我所知)它也是r.js
的默认行为。
这部分是故意的,因为更好地加载(使用RequireJS或<script/>
)来自CDN的这些外部库:您的用户的浏览器可能已经缓存了它们上次加载你的应用程序(或其他人的应用程序)。下次你的 myApp.js
更改时,它只会下载而不是一个包含所有相同外部库的单片软件包。
require
)还是浏览器,使用AMD或导出的全局属性(如{{1),uRequire实际上都有很长的路要走。 }},window.$
或外部库映射到的任何内容。)
我认为您可以轻松覆盖此行为:只要将window._
置于 project-1 的源文件夹中,只需将其放置在项目-1中即可。正常依赖。
或者,您可以再次将所有 project-2 文件构建/转换为AMD(未合并)到project-1的源文件夹中,并将它们作为其中的一部分使用。
最后,你可以将project-2源符号链接到project-1,它在unix / linux上支持几十年,也支持Windows 7以上版本。然后uRequire只会将两个项目的源转换一次并构建为单个输出。
理想情况下,我想拥有虚拟源(请参阅https://github.com/anodynos/uRequire/issues/40),这样您就可以将两个项目分开(即不将一个项目构建到另一个项目中),而是将它们构建为一个输出。