如何使用urequire嵌入依赖项

3

我使用 grunt-urequire 插件将我的项目1的模块编译成单个文件(让我们称之为 project-1.js)。配置如下:

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'
          }
        }
      }
    }
  }
}

项目1依赖于项目2,后者也由grunt-urequire管理。在package.json中:

"devDependencies": {
    "project2": "^0.1",
    ...
}

现在我想在构建时将项目2的依赖嵌入到项目1中,这样就可以只执行以下操作。
<script src="project-1.js"></script>

在浏览器中,不需要手动包含project-2。
我知道browserify支持这一点,但我能否使用urequire实现呢?
2个回答

1
如果您希望在同一个git存储库上对2个项目进行版本控制,因为它们一起更新并具有相同的发布生命周期,您可以使用分为2部分的构建脚本:
  • 第一部分是编译project2(project2 / src)
  • 第二部分是编译project1(project1 / src)
在编译project2期间,您可以将project2的分布式JS复制到project1 / src中,以便自动化。
如果您有不同的发布生命周期,可以使用一些grunt工具从CDN / NPM下载依赖项,并将其放入项目1 / src文件夹中,然后打包项目1。
这是Browserify使用NPM完成的一些操作,但使用Bower、components或自定义JS代码下载依赖项可能也会产生相同的效果。我建议使用像NPM这样的工具,因为它还会下载传递依赖项(如果有一天project2引入了一个依赖项,您就不必修改project1的构建...)。
最后,我不知道uRequire,但也许您可以从this project中获得灵感,该项目在打包版本(eventie)中嵌入了依赖项。

1

uRequire不会将外部依赖项(如 jquery underscore 等)嵌入到combined.js文件中,这与browserify不同,后者是唯一的选项(就我所知),并且也是r.js的默认行为。

这在某种程度上是故意的,因为最好使用CDN加载这些外部库(使用RequireJS或<script/>):您的用户的浏览器可能已经在上次加载您的应用程序(或其他人的应用程序)时缓存了它们。下次你的myApp.js更改时,它只会下载那个文件而不是包含所有相同外部库的庞大捆绑包。

实际上,uRequire采取了许多措施来确保这些在节点js(使用普通节点的require)或使用AMD或导出的全局属性(如window.$window._或映射到的任何外部库)在浏览器上进行加载。

我认为你可以很容易地覆盖这种行为:只需在构建 project-2.js 并将其放置在 project-1 的源文件夹中,然后在project-1中像普通依赖项一样使用它。
或者,您可以将所有的 project-2 文件再次构建/转换为AMD(未合并),并将它们作为项目的一部分放入project-1的源文件夹中。
最后,您可以将project-2源链接到project-1中,这在Unix / Linux上已经支持了几十年,在Windows 7及以上版本上也是如此。然后,uRequire将仅转换两个项目的源代码一次,并将其构建为单个输出。
理想情况下,我希望有虚拟源(请参见https://github.com/anodynos/uRequire/issues/40),这样您就可以将两个项目保持分离(即不将一个构建到另一个中),但是将两者都构建为一个输出。

1
是的,不幸的是,uRequire目前不支持此功能。要跟踪的问题是https://github.com/anodynos/uRequire/issues/26。 - Tvaroh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接