webpack — ReferenceError: документ не определен

#javascript #node.js #webpack

#javascript #node.js #webpack

Вопрос:

tl; dr: Webpack не будет компилироваться, и я не уверен, почему, когда все выглядит синтаксически правильно, а также я не совсем понимаю, что подразумевает эта ошибка.

Пытаюсь использовать webpack. Полное раскрытие: действительно новое для этого (js / интерфейс в целом). Я, наконец, устранил другие ошибки, которые я получал (в основном, просто указывая на неправильные пути к файлам или синтаксические ошибки). Я посмотрел видео на YouTube, чтобы настроить это, что, оглядываясь назад, возможно, было не лучшей идеей, но мне нужно было с чего-то начать, а смотреть проще, чем читать. В любом случае, я последовал этому и все пошло своим чередом. Установил все с помощью npm (см. package.json Ниже) и создал src / dist и так далее. Я не использую React / Angular / Vue и т.д., Просто обычный старый ванильный javascript. И я на Linux, если это имеет какое-то значение (я бы предположил, что нет).

Затем я столкнулся с этой ошибкой:

 ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wds」: Content not from webpack is served from /home/alan/dev/privateFolder/shrektime
ℹ 「wdm」: wait until bundle finished: /
✖ 「wdm」: Hash: 91bf4b6307b254c69adc
Version: webpack 4.44.1
Time: 1110ms
Built at: 04/09/2020 04:20:38
                               Asset      Size  Chunks                         Chunk Names
                    .dist/index.html  1.39 KiB          [emitted]              
55e664c36a02d03a083764a7c577f012.png  17.2 KiB          [emitted] [immutable]  
                           bundle.js   374 KiB    main  [emitted]              main
Entrypoint main = bundle.js
[0] multi (webpack)-dev-server/client?http://localhost:8080 ./src/main.js 40 bytes {main} [built]
[./node_modules/strip-ansi/index.js] 161 bytes {main} [built]
[./node_modules/webpack-dev-server/client/index.js?http://localhost:8080] (webpack)-dev-server/client?http://localhost:8080 4.29 KiB {main} [built]
[./node_modules/webpack-dev-server/client/overlay.js] (webpack)-dev-server/client/overlay.js 3.51 KiB {main} [built]
[./node_modules/webpack-dev-server/client/socket.js] (webpack)-dev-server/client/socket.js 1.53 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/createSocketUrl.js] (webpack)-dev-server/client/utils/createSocketUrl.js 2.91 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/log.js] (webpack)-dev-server/client/utils/log.js 964 bytes {main} [built]
[./node_modules/webpack-dev-server/client/utils/reloadApp.js] (webpack)-dev-server/client/utils/reloadApp.js 1.59 KiB {main} [built]
[./node_modules/webpack-dev-server/client/utils/sendMessage.js] (webpack)-dev-server/client/utils/sendMessage.js 402 bytes {main} [built]
[./node_modules/webpack/hot sync ^./log$] (webpack)/hot sync nonrecursive ^./log$ 170 bytes {main} [built]
[./src/js/components/Calendar.js] 1.18 KiB {main} [built]
[./src/js/components/Input.js] 171 bytes {main} [built]
[./src/js/components/Results.js] 603 bytes {main} [built]
[./src/js/handlers/base.js] 356 bytes {main} [built]
[./src/main.js] 2.7 KiB {main} [built]
      23 hidden modules

ERROR in   Error: /home/alan/dev/privateFolder/shrektime/node_modules/style-loader/dist/runtime/injectStylesIntoSty  leTag.js?:93
    var style = document.createElement('style');
                ^
  ReferenceError: document is not defined
  
  - injectStylesIntoStyleTag.js?:93 insertStyleElement
    [.]/[style-loader]/dist/runtime/injectStylesIntoStyleTag.js?:93:15
  
  - injectStylesIntoStyleTag.js?:208 addStyle
    [.]/[style-loader]/dist/runtime/injectStylesIntoStyleTag.js?:208:13
  
  - injectStylesIntoStyleTag.js?:81 modulesToDom
    [.]/[style-loader]/dist/runtime/injectStylesIntoStyleTag.js?:81:18
  
  - injectStylesIntoStyleTag.js?:239 module.exports
    [.]/[style-loader]/dist/runtime/injectStylesIntoStyleTag.js?:239:25
  
  - style.css?:15 eval
    /home/alan/dev/privateFolder/shrektime/src/style.css?:15:14
  
  - index.html:240 Object../src/style.css
    /home/alan/dev/privateFolder/shrektime/src/index.html:240:1
  
  - index.html:21 __webpack_require__
    /home/alan/dev/privateFolder/shrektime/src/index.html:21:30
  
  - loader.js:3 eval
    [index.html?.]/[html-webpack-plugin]/lib/loader.js:3:34
  
  - index.html:133 Object../node_modules/html-webpack-plugin/lib/loader.js!./src    /index.html
    /home/alan/dev/privateFolder/shrektime/src/index.html:133:1
  
  - index.html:21 __webpack_require__
    /home/alan/dev/privateFolder/shrektime/src/index.html:21:30
  

Child HtmlWebpackCompiler:
                                   Asset      Size  Chunks                         Chunk Names
    55e664c36a02d03a083764a7c577f012.png  17.2 KiB          [emitted] [immutable]  
       1 hidden asset
    Entrypoint HtmlWebpackPlugin_0 = __child-HtmlWebpackPlugin_0
    [./node_modules/css-loader/dist/cjs.js!./src/style.css] 5.29 KiB {HtmlWebpackPlugin_0} [built]
    [./node_modules/css-loader/dist/runtime/api.js] 2.46 KiB {HtmlWebpackPlugin_0} [built]
    [./node_modules/html-loader/dist/runtime/getUrl.js] 548 bytes {HtmlWebpackPlugin_0} [built]
    [./node_modules/html-webpack-plugin/lib/loader.js!./src/index.html] 4.34 KiB {HtmlWebpackPlugin_0} [built]
    [./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js] 6.64 KiB {HtmlWebpackPlugin_0} [built]
    [./src/img/icons8-shrek-256.png] 80 bytes {HtmlWebpackPlugin_0} [built]
    [./src/js/components/Calendar.js] 1.18 KiB {HtmlWebpackPlugin_0} [built]
    [./src/js/components/Input.js] 171 bytes {HtmlWebpackPlugin_0} [built]
    [./src/js/components/Results.js] 603 bytes {HtmlWebpackPlugin_0} [built]
    [./src/js/handlers/base.js] 356 bytes {HtmlWebpackPlugin_0} [built]
    [./src/js/handlers/dateHandler.js] 1.97 KiB {HtmlWebpackPlugin_0} [built]
    [./src/main.js] 2.7 KiB {HtmlWebpackPlugin_0} [built]
    [./src/style.css] 519 bytes {HtmlWebpackPlugin_0} [built]
ℹ 「wdm」: Failed to compile.
  

вот мой package.json

 {
  "name": "shrektime",
  "version": "1.0.0",
  "description": "A stupid idea gone too far",
  "main": "main.js",
  "type": "module",
  "dependencies": {
    "fractional": "^1.0.0",
    "lodash": "^4.17.20",
    "moment": "^2.27.0"
  },
  "devDependencies": {
    "@babel/core": "^7.11.6",
    "@babel/preset-env": "^7.11.5",
    "babel-loader": "^8.1.0",
    "css-loader": "^4.2.2",
    "file-loader": "^6.1.0",
    "html-loader": "^1.3.0",
    "html-webpack-plugin": "^4.4.1",
    "mini-css-extract-plugin": "^0.11.0",
    "node-sass": "^4.14.1",
    "sass-loader": "^10.0.2",
    "style-loader": "^1.2.1",
    "webpack": "^4.44.1",
    "webpack-cli": "^3.3.12",
    "webpack-dev-server": "^3.11.0"
  },
  "scripts": {
    "compile:sass": "node-sass src/sass/main.scss src/style.css -w",
    "dev": "webpack --mode development",
    "build": "webpack --mode production",
    "start": "webpack-dev-server --mode-development --open"
  },
  "author": "Alan Nardo",
  "license": "ISC"
}
  

в моей main.js папке у меня есть CSS и Sass, импортированные как таковые:

 import sass from './sass/main.scss';
import css from './style.css';
  

и, наконец, мой webpack.config.js файл:

 const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path');

module.exports = {

    entry: "./src/main.js",
    output: {
        filename: 'bundle.js',
        path: path.join(__dirname, 'dist'),
    },
    module: {
        rules: [
            {
                test: /.js$/,
                exclude: /node_modules/,
                use: { loader: "babel-loader" }
            },
            {
                test: /.html$/,
                use: [
                    {
                        loader: "html-loader",
                        options: { minimize: true }
                    }
                ]
            },
            {
                test: /.(png|svg|jpg|gif)$/,
                use: [
                    { loader: "file-loader" }
                ]
            },
            {
                test: /.css$/,
                use: [
                    "style-loader",
                    "css-loader"
                ],
            },
            {
                test: /.scss$/,
                loaders: ['style-loader', 'css-loader', 'sass-loader']
            },
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html",
            filename: ".dist/index.html"
        }),
        new MiniCssExtractPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css"
        })
    ]
};
  

Это изображение моей структуры папок:

структура проекта

Комментарии:

1. Похоже, что ваша установка пытается запустить клиентский код на сервере, где не document существует. Можете ли вы связать нас с руководством, которому вы следуете?

2. youtube.com/watch?v=TzdEpgONurw

3. также, как бы то ни было, в bundle.js нем есть код, поэтому он выполняет некоторые действия, которые, я полагаю, [built] означают в терминале

4. Удалось решить это, переставив загрузчики CSS

5. @RichardMuvirimi, который также разрешил это для меня — порядок загрузчиков sass / css / postcss

Ответ №1:

Я только что имел и решил эту проблему, не найдя ответа в stackoverflow. Итак, вот как я вызвал эту проблему: в webpack, в вашем разделе loader, если вы пропустите «тестовую» часть своего правила, вы можете вызвать эту ошибку. Проблема в том, что webpack вызовет ваш загрузчик для файлов неправильного типа и выдаст ошибки, подобные этой.

 ..
module: { 
  rules: [
    { 
      test: /.ts$/, 
      use: 'ts-loader', exclude: /node_modules/ 
    },
  ] 
}
..
  

(Я знаю, что приведенный выше вопрос содержит тесты, но моя репутация слишком мала, чтобы комментировать, и я считаю, что понимание основных причин ошибки имеет отношение к выяснению того, как их решить. Мне не нравится необъяснимое «Я сделал что-то, и теперь это работает!! виды ответов.)

Ответ №2:

Поэтому я не уверен, что у кого-то еще будет такая же ошибка, но на всякий случай нет ничего хуже, чем поискать форумы и найти точно такую же ошибку, и никто не оставит ответ.

Я получил помощь от дружественного редактора redditor (shoutout r / learnjavascript), и это было в основном всего лишь несколько синтаксических ошибок здесь и там, и я не понимал, как все работает.

в HtmlWebpackPlugin мне пришлось изменить имя файла с .dist/index.html на index.html и добавить следующий код в module.exports of webpack.config.js для запуска webpack-dev-server:

     devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        port: 9000
    }
  

который извлекается прямо со страницы документовhttps://webpack.js.org/configuration/dev-server/#devserver. Предположительно, вы можете выбрать любой номер порта, который вам нравится.

Кроме того, мне пришлось изменить способ импорта одного из моих js-файлов, поскольку это класс (и, возможно, мне следует это изменить, но я перейду этот мост, когда доберусь до него). Это вызвано, Calendar.js поэтому вместо того, чтобы делать import * as Calendar from './Calendar' , мне пришлось использовать import Calendar from './Calendar' .

Наконец, в моем src/index.html я оставил теги style и script для css и main.js соответственно, поэтому мне пришлось их удалить.