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

ktecyv1j  于 2022-12-08  发布在  Dojo
关注(0)|答案(2)|浏览(180)

我正在尝试使用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。
我必须改变什么才能得到单层的预期结果?在其当前的形式下,发布版本的大小仍然是114 MB,这肯定是太大了。

ldxq2e6h

ldxq2e6h1#

在“Creating Builds“教程中,它说:
您可能会问自己:“如果我们将所需的一切都构建到一个层中,为什么还要担心其余的模块?”如果您只保留层文件,而不保留其余的模块,那么您将失去这一选项,因为它可以让应用程序继续工作,而不必重新进行整个构建来访问这些模块。
也就是说,我同意你的观点,能够构建一个只包含层的最小发行版是很好的--因为即使浏览器可能只下载dojo/dojo.js层,分发100 MB的大目录也是很烦人的。
然而,即使构建脚本仅复制层文件,这些层也可能需要未在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

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

osh3o9ms

osh3o9ms2#

我不知道这是否有用,但我有一个情况,我正在创建一个层,它从一个完全不同的位置加载到核心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。
如果你在客户端做了一个修补程序,你需要一个dojo模块,而这个模块在require.cache中还没有,那么这个请求就会失败。如果你知道这不会发生,那么你就不需要这个包(希望如此)。

相关问题