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

Why is dojo build creating all packages as layers?

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

我安装的唯一包是 Arcgis-js-api 使用 bower:

"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 下创建一个包含所有依赖项的输出文件,但是当我使用此配置文件发布构建时,我收到了一个每个包的文件夹,已定义。

app/main 包包含一个 console.log 调用:

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

我预计只会得到一个非常小的版本,因为我基本上没有使用任何特定于 dojo 的内容。

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

在“Creating Builds”教程中,它说:

You might be asking yourself "if we build everything we need into a layer, why do we worry about the rest of the modules?" If you were to only keep the layer files and not have the rest of the modules available, you would lose that as an option to keep your application working without having to do a whole build again to access those modules.

就是说,我同意你的看法,如果能够构建一个只包含层的最小分布会很好 - 因为即使浏览器可能只下载 dojo/dojo.js 层,它也很烦人必须分发 100MB 的大目录。

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

在我的 dojo 项目中,我通常会在构建脚本末尾手动指定所需的内容并将其复制到 "minimal build" 目录。只要它是一个小型应用程序,这通常是可管理的。不过,这确实有点烦人且容易出错,所以如果有人知道更好的方法来完成您的要求,我很乐意听听。

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.

将这些文件的目标更改为我可以忽略的文件夹,该文件夹位于我的应用程序文件夹之外

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

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: './' 
        }
    ],

它并不完美,但它至少将必要的包保留在我的目录之外。我认为将所有文件捆绑到目录中的想法是针对您 运行 在核心层之外提出要求的情况。

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