如何使用urequire嵌入依赖项

时间:2014-07-19 19:40:37

标签: javascript gruntjs

我使用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吗?

2 个答案:

答案 0 :(得分:1)

如果您想在同一个git存储库上对2个项目进行版本化,因为它们一起更新并具有相同的发布生命周期,您可以将构建脚本分为两部分:

  • 第一部分是编译project2(project2 / src)
  • 第二部分是编译project1(project1 / src)

在编译project2期间,您可以将project2的分布式JS复制到project1 / src中,以便自动生成。


如果您有不同的发布生命周期,您可以使用一些grunt工具从CDN / NPM下载依赖项,并在打包项目1之前将其放入project1 / src文件夹中

这是Browserify通过使用NPM所完成的工作,但是下载依赖项可能与Bower,组件或自定义JS代码相同。我建议使用像NPM这样的工具,因为它也下载了传递依赖项(如果有一天project2引入了依赖项,你将不必触及project1构建......)

最后,我不知道你的需求,但也许你可能会受到this project的启发,它会在打包版本中嵌入依赖关系(eventie)

答案 1 :(得分:1)

uRequire没有将外部依赖项(如jqueryunderscore等)嵌入到combined.js文件中,这与browserify不同,这是唯一的选择(据我所知)它也是r.js的默认行为。

这部分是故意的,因为更好地加载(使用RequireJS或<script/>)来自CDN的这些外部库:您的用户的浏览器可能已经缓存了它们上次加载你的应用程序(或其他人的应用程序)。下次你的 myApp.js更改时,它只会下载而不是一个包含所有相同外部库的单片软件包。

实际上,无论是在nodejs(使用普通节点&#39; s 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),这样您就可以将两个项目分开(即不将一个项目构建到另一个项目中),而是将它们构建为一个输出。