Webpack: связывает модули requireJS и использует их в загрузчике dojo как пакеты - PullRequest
0 голосов
/ 03 сентября 2018

Пожалуйста, потерпите меня, потому что это не легко объяснить:

По сути, у меня есть приложение реагирования, которое включает в себя arcgis для библиотеки JS (решение карты) и модули requireJS.

В моем webpack.config ниже я объявляю как внешние все lib, начиная с esri или dojo, чтобы не добавлять их в комплект.

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'
}

Как вы заметили, мои пакеты main и vendor публикуются в 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.

...