【问题标题】:Webpack and Karma Testing: Uncaught ReferenceError: jQuery is not defined usingWebpack 和 Karma 测试:未捕获的 ReferenceError:jQuery 未使用定义
【发布时间】:2017-06-21 12:31:44
【问题描述】:

我对这个库有一个奇怪的问题。我已经设置我的 webpack 有一个外部

  externals: {
    jquery: 'jQuery'
  },

当我运行npm test 时,这会导致错误,删除它允许我的测试正确地运行业力。但是,如果我删除它,它不允许我在我的 app.jsx 中运行我的基础

require('style!css!foundation-sites/dist/foundation.min.css')
$('document').foundation(); //This is where it errors

因此,如果我删除外部的 jquery,我会在此时呈现错误。如果我添加外部 jquery: 'jQuery' 它会破坏测试。任何人都知道如何解决它。 jQuery 是我的 npm 模块的一部分。

【问题讨论】:

    标签: javascript jquery node.js reactjs karma-runner


    【解决方案1】:
    npm install jquery --save
    

    然后在你的模块中直接要求jquery

    var $ = require('jquery');
    require('style!css!foundation-sites/dist/foundation.min.css');
    $('document').foundation();
    

    【讨论】:

    • 试过了,它在$('document').foundation(); 行发现了一个错误
    【解决方案2】:

    在尝试了很多事情并重写了配置文件之后,我遇到了同样的错误。我不知道为什么,但这行得通。

    删除外部 更改插件:

      plugins: [
        new webpack.ProvidePlugin({
          'window.$': 'jquery',
          'window.jQuery': 'jquery'
        })
      ],
    

    结果:

    测试文件

    var React = require('react');
    var ReactDom = require('react-dom');
    var expect = require('expect');
    var $ = require('jquery');
    var TestUtils = require('react-addons-test-utils');
    
    var Clock = require('Clock');
    
    describe('Clock', () => {
        it ('should exist', () => {
            expect(Clock).toExist();
        });
        describe('rebder', () => {
            it('should render clock to output', () => {
                var clock = TestUtils.renderIntoDocument(<Clock totalSeconds={62}/>);
                var $el = $(ReactDom.findDOMNode(clock));
                var actualText = $el.find('.clock-text').text();
                expect(actualText).toBe('01:02');
            });
        });
        describe('formatSeconds', () => {
            it('should format seconds', () => {
                var clock = TestUtils.renderIntoDocument(<Clock/>);
                var seconds = 615;
                var expected = '10:15';
                var actual = clock.formatSeconds(seconds);
    
            expect(actual).toBe(expected);
        });
    
        it('should format seconds when min/sec are less than 10', () => {
            var clock = TestUtils.renderIntoDocument(<Clock/>);
            var seconds = 61;
            var expected = '01:01';
            var actual = clock.formatSeconds(seconds);
    
            expect(actual).toBe(expected);
            });
        });
    });
    

    我们的包文件

    var webpack = require('webpack');
    
    module.exports = {
      entry: [
        'script!jquery/dist/jquery.min.js',
        'script!foundation-sites/dist/foundation.min.js',
        './app/app.jsx'
      ],
      plugins: [
        new webpack.ProvidePlugin({
          'window.$': 'jquery',
          'window.jQuery': 'jquery'
        })
      ],
      output: {
        path: __dirname,
        filename: './public/bundle.js'
      },
      resolve: {
        root: __dirname,
        alias: {
          Main: 'app/components/Main.jsx',
          Timer: 'app/components/Timer.jsx',
          Clock: 'app/components/Clock.jsx',
          Navigation: 'app/components/Navigation.jsx',
          Countdown: 'app/components/Countdown.jsx',
          applicationStyles: 'app/styles/app.scss'
        },
        extensions: ['', '.js', '.jsx']
      },
      module: {
        loaders: [
          {
            loader: 'babel-loader',
            query: {
              presets: ['react', 'es2015', 'stage-0']
            },
            test: /\.jsx?$/,
            exclude: /(node_modules|bower_components)/
          }
        ]
      },
      devtool: 'cheap-module-eval-source-map'
    };
    

    package.json

    {
      "name": "TimerApp",
      "version": "1.0.0",
      "description": "Simple react app",
      "main": "index.js",
      "scripts": {
        "test": "karma start",
        "start": "node server.js"
      },
      "author": "Hyodo",
      "license": "MIT",
      "dependencies": {
        "axios": "^0.9.1",
        "express": "^4.13.4",
        "react": "^0.14.7",
        "react-dom": "^0.14.7",
        "react-router": "^2.0.0"
      },
      "devDependencies": {
        "babel-core": "^6.5.1",
        "babel-loader": "^6.2.2",
        "babel-preset-es2015": "^6.5.0",
        "babel-preset-react": "^6.5.0",
        "babel-preset-stage-0": "^6.5.0",
        "css-loader": "^0.23.1",
        "expect": "^1.14.0",
        "foundation-sites": "6.2.0",
        "jquery": "^2.2.1",
        "karma": "^0.13.22",
        "karma-chrome-launcher": "^0.2.2",
        "karma-mocha": "^0.2.2",
        "karma-mocha-reporter": "^2.0.0",
        "karma-sourcemap-loader": "^0.3.7",
        "karma-webpack": "^1.7.0",
        "mocha": "^2.4.5",
        "node-sass": "^3.4.2",
        "react-addons-test-utils": "^0.14.6",
        "sass-loader": "^3.1.2",
        "script-loader": "^0.6.1",
        "style-loader": "^0.13.0",
        "webpack": "^1.12.13"
      }
    }
    

    希望这对您或某人有所帮助。在 Udemy 学习 React 课程后,我遇到了这个问题。它有点过时,但测试部分正是我想要的。问题是这种配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2017-06-25
      • 2015-09-03
      • 2023-04-04
      相关资源
      最近更新 更多