Запуск webpack как дочернего процесса для создания исходных файлов

#javascript #webpack #antlr #antlr4

Вопрос:

Я новичок в webpack, так что извините, если это что-то очевидное. Я пытаюсь заставить пакет antlr4-webpack-loader работать, генерируя исходный код из .g4 файла. Я думаю, что я нахожусь там большую часть пути, так как у меня есть файл javascript require , и .bundle. файл, похоже, содержит вывод antlr4, однако в нем также есть это:

 module.exports = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'antlr4/index'"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));
 

contentScript.js начинается, как показано ниже:

 import 'jquery';
import 'antlr4'; // This line doesn't cause the error
import '../anaplan/AnaplanFormula.g4'; // This line causes the MODULE_NOT_FOUND error
 

webpack.config.js как показано ниже:

 var webpack = require("webpack"),
path = require("path"),
fileSystem = require("fs"),
env = require("./utils/env"),
CleanWebpackPlugin = require("clean-webpack-plugin").CleanWebpackPlugin,
CopyWebpackPlugin = require("copy-webpack-plugin"),
HtmlWebpackPlugin = require("html-webpack-plugin"),
WriteFilePlugin = require("write-file-webpack-plugin");

var options = {
  mode: process.env.NODE_ENV || "development",
  entry: {
    contentScript: path.join(__dirname, "src", "js", "contentScript.js"),
    background: path.join(__dirname, "src", "js", "background.js"),
  },
  output: {
    path: path.join(__dirname, "build"),
    filename: "[name].bundle.js"
  },
  module: {
    rules: [
      {
        test: /.css$/,
        loader: "style-loader!css-loader",
        exclude: /node_modules/
      },
      {
        test: new RegExp('.(jpg|jpeg|png|gif|eot|otf|svg|ttf|woff|woff2)

Из того, что я могу сказать antlr4-webpack-loader  , плагин создает новый процесс webpack только для файла .g4 и генерирует bundle.js файл из этого по мере его вывода, который затем объединяется в "родительский" файл. Я могу пройти через код внутри antlr4-webpack-loader  , и это, похоже, работает (как я уже сказал, вывод из него, похоже, находится в моем  contentScript.bundle.js  файле. Я могу рассматривать это как нечто, о  externals: [ 'antlr4/index' ],  чем я предполагаю, потому что файлы, которые он генерирует из файла .g4, требуют этого, но ссылка должна быть разрешена сценарием, который требовал g4.

Для справки,  package.json  ниже , в который не входит  antlr4  пакет devDependencies  , однако я получаю ту же ошибку, когда включаю его в оба  devDependencies  и dependencies  :

 {
  "name": "anaplanextension",
  "version": "1.0.0",
  "description": "",
  "main": "background.js",
  "directories": {
    "lib": "lib"
  },
  "dependencies": {
    "antlr4": "^4.9.2",
    "arrive": "^2.4.1",
    "jquery": "^3.6.0"
  },
  "devDependencies": {
    "antlr4-webpack-loader": "^0.1.1",
    "clean-webpack-plugin": "3.0.0",
    "copy-webpack-plugin": "5.0.5",
    "css-loader": "3.2.0",
    "file-loader": "4.3.0",
    "fs-extra": "8.1.0",
    "html-loader": "0.5.5",
    "html-webpack-plugin": "3.2.0",
    "style-loader": "1.0.0",
    "webpack": "4.41.2",
    "webpack-cli": "3.3.10",
    "webpack-dev-server": "3.9.0",
    "write-file-webpack-plugin": "4.5.1"
  },
  "scripts": {
    "build": "node utils/build.js",
    "start": "node utils/webserver.js"
  },
  "repository": {
    "type": "git",
    "url": "git https://github.com/georgeduckett/AnaplanExtension.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/georgeduckett/AnaplanExtension/issues"
  },
  "homepage": "https://github.com/georgeduckett/AnaplanExtension#readme"
}
 

Ответ №1:

Я рекомендую пойти здесь другим путем. Этот загрузчик webpack не обновлялся последние 4 года, использует довольно старую банку ANTLR4 (текущая версия 4.9.2) и использует среду выполнения Javascript, которая известна определенными проблемами.

Вместо этого я рекомендую вам переключиться на среду выполнения antlr4ts и использовать antlr4ts-cli для создания файлов из грамматики. Оба по-прежнему помечены как альфа, но я уже много лет использую эти пакеты (например, в моем расширении vscode vscode-antlr4).

С этим на месте вы можете удалить загрузчик webpack и сгенерировать файлы синтаксического анализа/лексера как часть процесса сборки.

),
loader: "file-loader?name=[name].[ext]",
exclude: /node_modules/
},
{
test: /.html$/,
loader: "html-loader",
exclude: /node_modules/
},
{
test: /.g4/,
exclude: /(node_modules)/,
use: {
loader:'antlr4-webpack-loader'
}
}
]
},
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules']
},
node: { module: "empty", net: "empty", fs: "empty" },
plugins: [
// clean the build folder
new CleanWebpackPlugin(),
// expose and write the allowed env vars on the compiled bundle
new webpack.EnvironmentPlugin(["NODE_ENV"]),
new CopyWebpackPlugin([{
from: "src/manifest.json",
transform: function (content, path) {
// generates the manifest file using the package.json informations
return Buffer.from(JSON.stringify({
description: process.env.npm_package_description,
version: process.env.npm_package_version,
...JSON.parse(content.toString())
}))
}
}]),
new WriteFilePlugin(),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
})
]
};

if (env.NODE_ENV === "development") {
options.devtool = "cheap-module-source-map";
}

module.exports = options;
Из того, что я могу сказать antlr4-webpack-loader , плагин создает новый процесс webpack только для файла .g4 и генерирует bundle.js файл из этого по мере его вывода, который затем объединяется в «родительский» файл. Я могу пройти через код внутри antlr4-webpack-loader , и это, похоже, работает (как я уже сказал, вывод из него, похоже, находится в моем contentScript.bundle.js файле. Я могу рассматривать это как нечто, о externals: [ 'antlr4/index' ], чем я предполагаю, потому что файлы, которые он генерирует из файла .g4, требуют этого, но ссылка должна быть разрешена сценарием, который требовал g4.

Для справки, package.json ниже , в который не входит antlr4 пакет devDependencies , однако я получаю ту же ошибку, когда включаю его в оба devDependencies и dependencies :


Ответ №1:

Я рекомендую пойти здесь другим путем. Этот загрузчик webpack не обновлялся последние 4 года, использует довольно старую банку ANTLR4 (текущая версия 4.9.2) и использует среду выполнения Javascript, которая известна определенными проблемами.

Вместо этого я рекомендую вам переключиться на среду выполнения antlr4ts и использовать antlr4ts-cli для создания файлов из грамматики. Оба по-прежнему помечены как альфа, но я уже много лет использую эти пакеты (например, в моем расширении vscode vscode-antlr4).

С этим на месте вы можете удалить загрузчик webpack и сгенерировать файлы синтаксического анализа/лексера как часть процесса сборки.