запутался в вебпаке и создании модулей amd - PullRequest
0 голосов
/ 21 марта 2020

Я создал файл в веб-пакете, как этот

//src/testamd.js
import Vue from 'vue';
import VueI18n from "vue-i18n";
import BootstrapVue from "bootstrap-vue";

export {Vue, VueI18n, BootstrapVue}

, который я обычно могу использовать в других файлах веб-пакетов, как этот

import Vue from './src/testamd'

И я я пытаюсь сгенерировать модуль amd из этого файла, чтобы я мог использовать его в requirejs проекте

Это окончательная конфигурация веб-пакета

  {
  "context": "/view/frontend/web",
  "entry": {
    "main": "./src/testamd.js"
  },
  "mode": "development",
  "output": {
    "path": "/view/frontend/web/public/build/",
    "filename": "[name].js",
    "publicPath": "/build/",
    "pathinfo": true,
    "libraryTarget": "amd"
  },
  "module": {
    "rules": [
      {
        "test": {},
        "exclude": {},
        "use": [
          {
            "loader": "babel-loader",
            "options": {
              "cacheDirectory": true,
              "sourceType": "unambiguous",
              "presets": [
                [
                  "@babel/preset-env",
                  {
                    "modules": false,
                    "targets": {},
                    "useBuiltIns": "usage",
                    "corejs": 3
                  }
                ]
              ],
              "plugins": [
                "@babel/plugin-syntax-dynamic-import"
              ]
            }
          }
        ]
      },
      {
        "resolve": {
          "mainFields": [
            "style",
            "main"
          ],
          "extensions": [
            ".css"
          ]
        },
        "test": {},
        "oneOf": [
          {
            "resourceQuery": {},
            "use": [
              {
                "loader": "style-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "css-loader",
                "options": {
                  "sourceMap": false,
                  "importLoaders": 0,
                  "modules": true,
                  "localIdentName": "[local]_[hash:base64:5]"
                }
              }
            ]
          },
          {
            "use": [
              {
                "loader": "style-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "css-loader",
                "options": {
                  "sourceMap": false,
                  "importLoaders": 0,
                  "modules": false,
                  "localIdentName": "[local]_[hash:base64:5]"
                }
              }
            ]
          }
        ]
      },
      {
        "test": {},
        "loader": "file-loader",
        "options": {
          "name": "images/[name].[hash:8].[ext]",
          "publicPath": "/build/"
        }
      },
      {
        "test": {},
        "loader": "file-loader",
        "options": {
          "name": "fonts/[name].[hash:8].[ext]",
          "publicPath": "/build/"
        }
      },
      {
        "resolve": {
          "mainFields": [
            "sass",
            "style",
            "main"
          ],
          "extensions": [
            ".scss",
            ".sass",
            ".css"
          ]
        },
        "test": {},
        "oneOf": [
          {
            "resourceQuery": {},
            "use": [
              {
                "loader": "style-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "css-loader",
                "options": {
                  "sourceMap": false,
                  "importLoaders": 0,
                  "modules": true,
                  "localIdentName": "[local]_[hash:base64:5]"
                }
              },
              {
                "loader": "resolve-url-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "sass-loader",
                "options": {
                  "sourceMap": true,
                  "outputStyle": "expanded"
                }
              }
            ]
          },
          {
            "use": [
              {
                "loader": "style-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "css-loader",
                "options": {
                  "sourceMap": false,
                  "importLoaders": 0,
                  "modules": false,
                  "localIdentName": "[local]_[hash:base64:5]"
                }
              },
              {
                "loader": "resolve-url-loader",
                "options": {
                  "sourceMap": false
                }
              },
              {
                "loader": "sass-loader",
                "options": {
                  "sourceMap": true,
                  "outputStyle": "expanded"
                }
              }
            ]
          }
        ]
      },
      {
        "test": {},
        "use": [
          {
            "loader": "vue-loader",
            "options": {}
          }
        ]
      },
      {
        "resourceQuery": {},
        "type": "javascript/auto",
        "loader": "@kazupon/vue-i18n-loader"
      }
    ]
  },
  "plugins": [
    {
      "entriesToDelete": []
    },
    {
      "opts": {
        "publicPath": null,
        "basePath": "build/",
        "fileName": "manifest.json",
        "transformExtensions": {},
        "writeToFileEmit": true,
        "seed": {},
        "map": null,
        "generate": null,
        "sort": null
      }
    },
    {
      "paths": [
        "**/*"
      ],
      "options": {
        "root": "/view/frontend/web/public/build/",
        "verbose": false,
        "allowExternal": false,
        "dry": false
      }
    },
    {
      "definitions": {
        "process.env": {
          "NODE_ENV": "\"development\""
        }
      }
    },
    {
      "options": {
        "title": "Webpack Encore"
      },
      "lastBuildSucceeded": false,
      "isFirstBuild": true
    },
    {},
    {
      "compilationSuccessInfo": {
        "messages": []
      },
      "shouldClearConsole": false,
      "formatters": [
        null,
        null,
        null,
        null,
        null,
        null
      ],
      "transformers": [
        null,
        null,
        null,
        null,
        null,
        null
      ],
      "previousEndTimes": {}
    },
    {
      "outputPath": "public/build/",
      "friendlyErrorsPlugin": {
        "compilationSuccessInfo": {
          "messages": []
        },
        "shouldClearConsole": false,
        "formatters": [
          null,
          null,
          null,
          null,
          null,
          null
        ],
        "transformers": [
          null,
          null,
          null,
          null,
          null,
          null
        ],
        "previousEndTimes": {}
      }
    },
    {
      "options": {
        "template": "./public/index.html",
        "filename": "index.html",
        "hash": false,
        "inject": true,
        "compile": true,
        "favicon": false,
        "minify": false,
        "cache": true,
        "showErrors": true,
        "chunks": "all",
        "excludeChunks": [],
        "chunksSortMode": "auto",
        "meta": {},
        "title": "Webpack App",
        "xhtml": false
      }
    },
    {
      "options": {
        "filename": "entrypoints.json",
        "prettyPrint": false,
        "update": false,
        "fullPath": true,
        "manifestFirst": true,
        "useCompilerPath": false,
        "fileTypes": [
          "js",
          "css"
        ],
        "includeAllFileTypes": true,
        "keepInMemory": false,
        "integrity": false,
        "path": "/view/frontend/web/public/build/",
        "entrypoints": true
      }
    }
  ],
  "optimization": {
    "namedModules": true,
    "chunkIds": "named",
    "runtimeChunk": "single",
    "splitChunks": {
      "chunks": "all"
    }
  },
  "watchOptions": {
    "aggregateTimeout": 300,
    "poll": 1000
  },
  "devtool": false,
  "performance": {
    "hints": false
  },
  "stats": {
    "hash": false,
    "version": false,
    "timings": false,
    "assets": false,
    "chunks": false,
    "maxModules": 0,
    "modules": false,
    "reasons": false,
    "children": false,
    "source": false,
    "errors": false,
    "errorDetails": false,
    "warnings": false,
    "publicPath": false,
    "builtAt": false
  },
  "resolve": {
    "extensions": [
      ".wasm",
      ".mjs",
      ".js",
      ".json",
      ".jsx",
      ".vue",
      ".ts",
      ".tsx"
    ],
    "alias": {
      "vue$": "vue/dist/vue.esm.js"
    }
  },
  "externals": []
}

И теперь я был под Предположение, что я мог бы использовать требуют js, чтобы загрузить это и использовать экспортированные элементы, подобные этому

require(['testamd'], function (Vue, VueI18n, BootstrapVue) {
        console.log(Vue);
        console.log(VueI18n);
        console.log(BootstrapVue);
});

Файл загружается, когда мой отладчик ломается внутри testamd.js, но результат из console.log говорит

Vue => 1
VueI18n => undefined
BootstrapVue => undefined 

Я перепробовал множество конфигураций, как я нашел в отношении outpput в документах веб-пакета

  • , используя umd вместо isd amd (тот же результат)
  • , используя вместо этого именованную библиотеку из неназванного (он дал все переменные как неопределенные)
  • с использованием экспорта по умолчанию в testamd. js

Но, похоже, результат всегда не тот, на который я рассчитывал.

Можно ли делать то, что я хочу, или я пытаюсь напрасно?

Это итоговый файл ввода

define(function() { return (window["webpackJsonp"] = window["webpackJsonp"] || []).push([["main"],{

/***/ "./src/testamd.js":
/*!************************!*\
  !*** ./src/testamd.js ***!
  \************************/
/*! exports provided: Vue, VueI18n, BootstrapVue */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Vue", function() { return vue__WEBPACK_IMPORTED_MODULE_0__["default"]; });

/* harmony import */ var vue_i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-i18n */ "./node_modules/vue-i18n/dist/vue-i18n.esm.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VueI18n", function() { return vue_i18n__WEBPACK_IMPORTED_MODULE_1__["default"]; });

/* harmony import */ var bootstrap_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bootstrap-vue */ "./node_modules/bootstrap-vue/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BootstrapVue", function() { return bootstrap_vue__WEBPACK_IMPORTED_MODULE_2__["default"]; });


/***/ })

},[["./src/testamd.js","runtime","vendors~main"]]])});;

Я обновляю с помощью Мои выводы о том, что проблема, похоже, возникла из-за моего использования symfony / webpack-encore


Новое обновление, я каким-то образом смог заставить его работать, изменив настройки оптимизации для кусков и времени выполнения. js на

  "optimization": {
    "namedModules": true,
    "chunkIds": "named",
    "splitChunks": {
      "chunks": "async"
    }
  },
...