Webpack: Uncaught ReferenceError: требование не определено

В моем проекте PHP - я пытаюсь собрать файлы js с помощью webpack и babel. Есть 3 файла js - config.js helper.js script.js. Они зависят друг от друга. helper.js зависит от config.js, а script.js зависит от helper.js.

config.js:

module.exports = {
  const DG_GRAPH_TYPE = 'line';

  const DG_XAXIS_TICKS = 4;

  const DG_SINGLE_POST_GRAPH_CANVAS_HEIGHT = 250;
  ......



helper.js:

const config = require('./config');

module.exports = {
......



script.js:

const helper = require('./helper');

jQuery(document).ready(function ($) {
......

Вот мой файл wepack.config.js, в котором я настроил следующий код:

const path = require('path');

module.exports = {
    entry: {
        script: [
            './assets/js/script.js'
        ]
    },
    output: {
        filename: '[name].bundle.min.js',
        path: path.resolve(__dirname, 'build'),
    },
    resolve: {
        extensions: ['.js', '.css']
    },
    module: {
        rules: [
            {
                test: /\.js/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                        plugins: [require('@babel/plugin-proposal-object-rest-spread')]
                    }
                },
                parser: {
          amd: false, // disable AMD
          commonjs: false, // disable CommonJS
          system: false, // disable SystemJS
          harmony: true, // disable ES2015 Harmony import/export
          requireInclude: false, // disable require.include
          requireEnsure: false, // disable require.ensure
          requireContext: false, // disable require.context
          browserify: true, // disable special handling of Browserify bundles
          requireJs: true, // disable requirejs.*
          node: false, // disable __dirname, __filename, module, require.extensions, require.main, etc.
        }
            }
        ],
    }
};

Все работает нормально, за исключением того, что когда я добавляю встроенный файл сценария в проект, я получаю следующую ошибку консоли браузера:

Uncaught ReferenceError: require is not defined at Object. (script.bundle.min.js?ver=4.9.8:1) at a (script.bundle.min.js?ver=4.9.8:1) at Object. (script.bundle.min.js?ver=4.9.8:1) at a (script.bundle.min.js?ver=4.9.8:1) at script.bundle.min.js?ver=4.9.8:1 at script.bundle.min.js?ver=4.9.8:1

Я ожидал, что require.js должен решить проблему. Но это не так.

Не могли бы вы предложить мне подходящий способ решения проблемы?

РЕДАКТИРОВАТЬ

Основная идея работы - просто собрать несколько файлов js в одном месте, а также добавить babel, чтобы сделать его дружественным к браузеру, если мне нужно добавить ES6 / ES7.

Мой основной файл js - это script.js, у которого есть две зависимости: config.js и helper.js. Итак, я должен был собрать только script.js, в котором я хотел сохранить файл зависимостей import/require.

Сначала я попытался записать все файлы js, но все, что у меня было, было собрано script.js, а не другими. -

entry: {
        script: [
            './assets/js/config.js'
            './assets/js/helper.js'
            './assets/js/script.js'
        ]
    },

Вот package.json -

{
  "name": "GRAPH",
  "version": "1.0.0",
  "description": "Graph plugin",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack"
  },
  "author": "ABC",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.1.0",
    "@babel/polyfill": "^7.0.0",
    "@babel/preset-env": "^7.1.0",
    "babel-loader": "^8.0.4",
    "jquery": "^3.3.1",
    "mini-css-extract-plugin": "^0.4.3",
    "requirejs": "^2.3.6",
    "webpack": "^4.20.2",
    "webpack-cli": "^3.1.1",
    "webpack-dev-server": "^3.1.9"
  }
}

Кроме того, да. Я добавлял встроенный файл js в тег <script>.

КОНЕЦ РЕДАКТИРОВАНИЯ

Заранее спасибо!

Как вы «строите»? . Похоже, вы просто включаете скрипт в тег браузера <script>. require работает только в среде node. После процесса сборки преобразованный javascript будет понят браузером. Если вы отредактируете свой ответ, указав, какие шаги сборки вы выполняете, я мог бы изучить его подробнее. кроме того, есть ли в вашем package.json какие-нибудь скрипты?

axm__ 01.10.2018 10:35

@axm__ Спасибо за ваш комментарий. Я обновил свой вопрос.

user3384985 01.10.2018 12:00

В вашем package.json упоминается { build: webpack }. Вы действительно запускали npm run build для выполнения команды? Если нет, не могли бы вы сделать это, прежде чем я попытаюсь ответить на вопрос и сообщить мне, каков результат. Команда должна вывести построенный файл по пути вывода, который вы указали в webpack.config.json. Чтобы узнать больше о скриптах npm: michael-kuehnel.de/tooling/2018/03/22/…

axm__ 01.10.2018 12:14

@axm__ да, я создал выходной файл js с помощью npm run build. Когда я добавляю выходной файл js и добавляю его в тег <script> в консоли браузера, я получаю сообщение об ошибке require is undefined.

user3384985 01.10.2018 12:43

Хорошо, это странно. Как выглядит ваш выходной файл? Вы можете увидеть, есть ли вообще какое-нибудь преобразование?

axm__ 01.10.2018 12:55

Да, в выходном файле я вижу, что файл script.js построен идеально, но не создаются другие два файла.

user3384985 01.10.2018 12:59

Итак, моя головная боль связана с import/require двумя другими файлами js в файлах script.js. Когда я require файл helper.js в script.js, на самом деле ошибка require is not undefined появляется в консоли.

user3384985 01.10.2018 13:02

Это код выше в script.js - const helper = require('./helper');, который не запускает

user3384985 01.10.2018 13:03

Ok. Почему вы установили module.parser.node на false? webpack запускается в node и использует разрешение модуля nodejs. что произойдет, если вы измените его на true и requirejs на false

axm__ 01.10.2018 13:11

все еще та же проблема

user3384985 01.10.2018 13:22
module.parser.node - false, это вариант по умолчанию. Чем я занимался до require другие файлы с require.js
user3384985 01.10.2018 13:24

Позвольте нам продолжить обсуждение в чате.

axm__ 01.10.2018 13:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
12
10 937
3

Ответы 3

Функция require отсутствует в браузерах, только в средах Node. Взгляните на это.

Сначала вам нужно собрать пакет, чтобы он был понятен браузеру. Ошибка require is not defined указывает на то, что вы находитесь не в среде node (она не была вызвана чем-то вроде node runthiscurrentprogram.js или программой, запускающей для вас node. Подробнее о формате вывода с requireздесь

Webpack - это пакет, который работает в node, который может объединять и / или преобразовывать исходные файлы (может быть javascript, css и т. д.) И размещать их там, где вы хотите. Файл пакетов можно включить в тег <script>, чтобы он был понятен браузеру.

Чтобы запустить веб-пакет, либо запустите npm run build (потому что у вас есть сценарий с именем build в ваших сценариях package.json или npx webpack (подробнее о npxздесь). Это вызывает исполняемый файл webpack в /path_to_your_project/node_modules/.bin/webpack. Если вы откроете этот файл, вы увидите, что он запущен в узле (начинается с #!/usr/bin/env node)

Теперь вы упомянули, что ваш основной файл - это script.js, которому «требуются» эти другие файлы. В этом случае вам нужно только указать script.js в записи веб-пакета. Webpack автоматически объединяет необходимые файлы в пакет. Весь код будет помещен на ваш outputPath в одном файле. (Есть способы / причины иметь несколько записей, но не в вашем случае, я думаю, подробнее здесь).

Итак, запустите npm run webpack, npx webpack и посмотрите на выходной путь, есть ли там новый файл, и включите файл что в тег <script>.

Проблема в том, что файл script.js не может требовать два других файла. Поэтому в console я получаю ошибку. Итак, каков подходящий способ для require двух других js в script.js?

user3384985 01.10.2018 12:45

Я пришел к той же ошибке, но вместо webpack я использовал gulp. Babel транспонировал ES6 в ES5, но он не соответствовал заявлениям import и required. Короче говоря, мне помогла библиотека глоток-братан. Вы можете найти пошаговые инструкции в этом Answare.

Другие вопросы по теме