【问题标题】:Webpack does not import bundles from node_modules (js only)Webpack 不会从 node_modules 导入包(仅限 js)
【发布时间】:2019-06-16 20:31:28
【问题描述】:

早安,

我对 Webpack 还是很陌生,感觉有点迷茫——从源路径导入模块工作得很好——但是从 node_modules(例如 jQuery)导入模块会给我找不到模块的错误消息。我完全迷失了,甚至不知道要寻找什么或如何进一步调试。

我得到的错误信息是:

external "jquery":1 Uncaught ReferenceError: jquery is not defined
    at Object.jquery (external "jquery":1)
    at __webpack_require__ (bootstrap:723)
    at fn (bootstrap:100)
    at Object../js/ManagementApplication.ts (ManagementApplication.ts:5)
    at __webpack_require__ (bootstrap:723)
    at fn (bootstrap:100)
    at Object.0 (dist.js:40457)
    at __webpack_require__ (bootstrap:723)
    at bootstrap:790
    at bootstrap:790
jquery @ external "jquery":1
__webpack_require__ @ bootstrap:723
fn @ bootstrap:100
./js/ManagementApplication.ts @ ManagementApplication.ts:5
__webpack_require__ @ bootstrap:723
fn @ bootstrap:100
0 @ dist.js:40457
__webpack_require__ @ bootstrap:723
(anonymous) @ bootstrap:790
(anonymous) @ bootstrap:790

这是我的 webpack 配置:

// shared config (dev and prod)
const {resolve} = require('path');
const {CheckerPlugin} = require('awesome-typescript-loader');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require("webpack")


module.exports = {
    resolve: {
        extensions: ['.ts', '.js'],
    },
    context: resolve(__dirname, '../src/main/'),
    output: {
        filename: "dist.js",
        path: resolve(__dirname, '../target')
    },
    externals: {
        bootstrap: "bootstrap",
        jquery: "jquery"
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                use: ['babel-loader'],
            },
            {
                test: /\.tsx?$/,
                use: ['babel-loader', 'awesome-typescript-loader'],
            },
            {
                test: /\.css$/,
                use: ['style-loader', {loader: 'css-loader', options: {importLoaders: 1}}],
            },
            {
                test: /\.(scss)$/,
                use: [{
                    loader: 'style-loader', // inject CSS to page
                }, {
                    loader: 'css-loader', // translates CSS into CommonJS modules
                }, {
                    loader: 'postcss-loader', // Run postcss actions
                    options: {
                        plugins: function () { // postcss plugins, can be exported to postcss.config.js
                            return [
                                require('autoprefixer')
                            ];
                        }
                    }
                }, {
                    loader: 'sass-loader' // compiles Sass to CSS
                }]
            },

            {
                test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                use: 'url-loader?limit=10000',
            },
            {
                test: /\.hbs/,
                loaders: "handlebars-loader"
            },
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                loaders: [
                    'file-loader?hash=sha512&digest=hex&name=img/[hash].[ext]',
                    'image-webpack-loader?bypassOnDebug&optipng.optimizationLevel=7&gifsicle.interlaced=false',
                ],
            },
        ],
    },
    plugins: [
        new CheckerPlugin(),
        new HtmlWebpackPlugin(),
        new webpack.IgnorePlugin(/\/iconv-loader$/)
    ],
    performance: {
        hints: false,
    },
};

还有这个:

// development config
const merge = require('webpack-merge');
const webpack = require('webpack');
const commonConfig = require('./common');

module.exports = merge(commonConfig, {
    mode: 'development',
    entry: [
        'webpack-dev-server/client?http://localhost:4000',// bundle the client for webpack-dev-server and connect to the provided endpoint
        'webpack/hot/only-dev-server', // bundle the client for hot reloading, only- means to only hot reload for successful updates
        './js/ManagementApplication.ts' // the entry point of our app
    ],

    devServer: {
        hot: true,
        host: "0.0.0.0",
        port: "4000"

    },
    devtool: 'source-map',
    plugins: [
        new webpack.HotModuleReplacementPlugin(), // enable HMR globally
        new webpack.NamedModulesPlugin(), // prints more readable module names in the browser console on HMR updates
    ],
});

(它们都已加载,后一个覆盖第一个)。

我已经检查了十亿次库是否在 node_modules 中正确 - 只是不知道为什么没有加载它们。这个问题不仅针对特定图书馆,而且针对所有图书馆。

相比之下,从库中导入 css 资源效果很好。

有没有人知道如何解决这个问题或可以帮助我了解正在发生的事情?

【问题讨论】:

  • 您的 jquery 导入是什么样的?它在生产构建或开发热重载构建时失败?
  • 它是import "jquery" - 它在热重载构建时失败

标签: javascript node.js typescript webpack


【解决方案1】:

如果不查看更多项目,实际上并不能 100% 确定,但请尝试一下。

将您的 jquery 设置为外部:

"jquery": "jQuery"

并在您的项目中使用 jquery:import jQuery from 'jquery'import $ from 'jquery'

【讨论】:

    【解决方案2】:

    如果您打算将jquery 视为外部,@Pandelis 答案是正确的(注意大写的Qjquery: jQuery)。但如果您想将 jquery 作为节点模块导入,请参见下文。

    使用 jQuery 作为节点模块

    如果你想使用 jQuery 作为节点模块并捆绑它,你应该从 npm 安装 jquery

    npm install jquery
    

    然后在你的代码中导入它

    import $ from "jquery";
    

    无需向webpack.config.js 添加任何内容。但是如果你想使用 jQuery 作为外部:

    使用jQuery作为外部

    当你在webpack.config.js中做这样的事情时:

    ...
    module.exports = {
      externals: {
        jquery: "jQuery" // or jquery: "$"
      },
      ...
    }
    

    它告诉 webpack 在import jquery 行中,jquery 不应该被捆绑;相反,在全局范围内寻找jQuery 对象(在我们的例子中是window)。 jQuery$ 都将有效。这也意味着您必须从外部源加载 jquery:

    #index.html
    
    <script
      src="https://code.jquery.com/jquery-3.3.1.min.js"
      integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
      crossorigin="anonymous"></script>
    <sript src="bundle.js"></script>
    

    然后在你的代码中,你可以这样做

    import 'jquery' // or import $ from 'jquery'
    $...
    

    只是为了说明,你也可以这样做 externals: { foo: 'jQuery' }import 'foo' 仍然可以工作。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2018-09-06
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2018-02-13
      • 2017-09-07
      • 2019-04-12
      相关资源
      最近更新 更多