Webpack:捆绑requireJS模块,并在dojo loader中将它们作为软件包使用

时间:2018-09-03 11:02:44

标签: webpack dojo requirejs

请忍受,因为这不容易解释:

基本上,我有一个react应用程序,其中包含用于JS库(地图解决方案)和requireJS模块的arcgis。

在下面的webpack.config中,我将以esri或dojo开头的所有lib声明为外部文件,以免将其添加到包中。

devtool: 'source-map',
entry: ['babel-polyfill', './lib/app/index.js'],
output: {
  libraryTarget: 'amd',
},
resolve: {
  extensions: ['.webpack.js', '.web.js', '.js'],
},
externals: [
  function(context, request, callback) {
    if (
      /^dojo/.test(request) ||
      /^vendor_lib/.test(request) ||
      /^dojox/.test(request) ||
      /^dijit/.test(request) ||
      /^esri/.test(request)  ||
      /^esriapp/.test(request)
    ) {
      callback(null, 'amd ' + request);
    } else {
      callback();
    }
  },
],

Arcgis Map与dojo协同工作,因此必须设置dojo加载程序。 在我的index.htlm中,必须将其设置为需要包main.bundle才能与arcgis lib一起使用。

    <head>
    <script type="text/javascript">
            var dojoConfig = {
               parseOnLoad: false,
               async: true,
               packages: [
               {
                name: 'esriapp',
                location: "/ui/loc" + '/js'
                },
                {
                name: 'vendor_lib',
                location: "//static.solutions.com/ui/loc/static/vendor",
                main: "vendor.bundle.0d2fdaf854996166b09f"
                }
                ],
                callback: function () {                                 
require(["//static.solutions.com/ui/loc/static/main.bundle.cbfa3433d23bbdcda6ab.js"]);
                }
          };

    </script>
    </head>
            <body>
                   <script type="text/javascript"
src="https://js.arcgis.com/3.18/init.js"></script>

                  </body>

这一切正常。

但是,在导入自定义requireJS模块方面存在问题:

{
name: 'esriapp',
location: "/ui/loc" + '/js'
}

您已经注意到,我的捆绑包主包和供应商都发布到带有哈希签名的CDN中。

但是,“ / ui / loc”(esriapp)指向本地存储库。它包含我开发的requireJS模块,其中包含对arcgis lib的引用。 示例(/ui/loc/ClusterLayer.js):

define(
      [
        'dojo/_base/declare',
        'esri/dijit/PopupTemplate',
        'esri/layers/GraphicsLayer',
        'esri/geometry/ScreenPoint',
        ...
      ],
      function(
        declare,
        arrayUtils,
        ...
      ) {
        return declare( 'esriapp.ClusterLayer',[GraphicsLayer], {
    ...

这些文件不是捆绑软件的一部分,因此不是指纹(版本化)。

因此,当我在生产环境中部署我的应用程序时,根据部署的版本,有时'esriapp'返回的文件不正确。

基本上,我得到的文件版本与我已部署的应用程序版本不同。

所以问题是:

如何捆绑在本地开发的requireJS模块,并将其用作dojo中的软件包。

0 个答案:

没有答案