繁体   English   中英

为什么dojo build将所有包都创建为图层?

[英]Why is dojo build creating all packages as layers?

我正在尝试使用dojo创建一个构建,它非常简单。

我安装的唯一软件包是使用Bower的Arcgis-js-api:

"dependencies": {
    "esri": "arcgis-js-api#3.21.0"
}

我的build.profile.js定义如下:

var profile = {
  basePath: "./src",
  action: "release",
  cssOptimize: "comments",
  mini: true,
  layerOptimize: "closure",
  packages: [
    "app",
    "dijit",
    "dojo",
    "dojox",
    "dstore",
    "dgrid",
    "dgrid1",
    "xstyle",
    "put-selector",
    "esri", {
      name: "moment",
      location: "moment",
      main: "moment"
    }
  ],
  useSourceMaps: false,
  mini: true,
  stripConsole: "warn",
  selectorEngine: "lite",

    layers: [{
      "dojo/dojo": {
        boot: true,
        customBase:true,
        include: [
          "app/main"
        ]
      }
    }]
};

如果我正确理解了构建系统上的dojo文档,则应该在dojo / dojo.js下创建一个包含所有依赖项的单个输出文件,但是当我使用此配置文件发布构建时,我会收到每个软件包的文件夹,该文件夹包含被定义。

应用程序/主程序包由一个console.log调用组成:

define([],function(){
    console.log("ratzupaltuff");
});

我期望只会得到很小的发行版,因为我基本上不使用任何特定的dojo。

为了获得单层所需的结果,我必须更改什么? 在当前形式下,发布版本仍为114Mb,这肯定太大了。

在“ 创建内部版本 ”教程中,它表示:

您可能会问自己“如果我们将所需的所有内容构建到一个层中,为什么还要担心其余模块?” 如果只保留层文件而没有其余模块可用,那么您将失去这一选择,以保持应用程序正常工作,而不必再次进行整个构建来访问这些模块。

就是说,我同意你的意见,能够构建仅包含各层的最小发行版将是一件好事-因为即使浏览器可能仅下载dojo / dojo.js层,也不得不分发大的100MB还是很烦人的目录。

但是,即使构建脚本仅复制了图层文件,图层也可能需要各种在AMD依赖关系图中未声明的资源文件(例如,图像或字体)。

在我的dojo项目中,我通常求助于在构建脚本末尾手动指定所需内容并将其复制到“最小构建”目录。 只要是小型应用程序,这通常是可管理的。 当然,这确实有点烦人并且容易出错,因此,如果有人知道一种更好的方法来完成您要问的事情,我很想听听。

node ../../dojo/dojo.js load=build --profile "$PROFILE" --releaseDir "$DISTDIR" $@
# ... 
FILES=(
    index.html
    myapp/resources/myapp.css
    myapp/resources/logo.svg
    dojo/dojo.js
    dojo/resources/blank.gif
    dijit/themes/claro/form/images/buttonArrows.png
)
for file in ${FILES[*]}; do
    mkdir -p $MINIMAL_DIST_DIR/`dirname $file`
    cp $DISTDIR/myapp/$file $MINIMAL_DIST_DIR/$file
done

(文件myapp.css @imports dojo.css等,因此所有CSS都内置于该文件中。)

我不知道这是否有用,但是我遇到的情况是我正在创建一个图层,该图层从完全不同的位置加载到核心dojo应用程序。

这意味着我实际上不需要在我的构建中加入dojodijitdojox 无论是否需要,我都遇到了将所有文件捆绑到我的位置的问题。

我选择的是将这些文件的目标更改为一个文件夹,通过使用destLocation可以忽略该文件夹位于我的应用程序文件夹destLocation

所以我在构建脚本中有这个

packages: [
        {
          name: "dojo", 
          location: "./dtk/dojo",
          destLocation: '../directory/outside/of/codebase/dojo'
        },
        {
          name: "dijit", location: "./dtk/dijit", 
          destLocation: '../directory/outside/of/codebase/dijit' },
        {
          name: "dojox", 
          location: "./dtk/dojox", 
          destLocation: '../directory/outside/of/codebase/dojox'
        },
        { 
          name: "applayer", 
          location: "./location/of/my/release/folder/", 
          destLocation: './' 
        }
    ],

它不是完美的,但至少将必要的软件包保留在我的目录之外。 我认为将所有文件捆绑到目录中的想法是为了在核心层之外运行需求。

例如,如果您在客户端中执行了修补程序,并且需要的dojo模块尚未在require.cache则此请求将失败。 如果您知道那不会发生,那么您就不需要软件包(希望如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM