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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么dojo构建将所有包创建为层?相关的知识,希望对你有一定的参考价值。

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

app / main包由一个console.log调用组成:

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

我期待只获得一个非常小的版本,因为我基本上没有使用dojo特定的。

我需要更改什么才能获得单个图层的预期结果?在目前的形式下,发布版本仍然是114Mb,这当然太大了。

答案

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

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

也就是说,我同意你的意见,能够构建一个只包含层的最小分布会很好 - 因为即使浏览器只能下载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将这些文件的目标更改为我可以忽略的文件夹,该文件夹位于我的应用程序文件夹之外。

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

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的事件。

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

以上是关于为什么dojo构建将所有包创建为层?的主要内容,如果未能解决你的问题,请参考以下文章

dojo/cordova 项目的单层构建文件

如何从AMD dojo创建构建

您可以同时使用 Dojo.Build 和 CDN 吗?

有没有办法构建一个包含来自包位置的单个文件的 Dojo 模块?

Dojo vs JQuery 编程小部件创建

dojo js library + jsdoc -> 如何记录代码?