Rails webpack 错误:第 3 方 gem 无法解析 jQuery

Posted

技术标签:

【中文标题】Rails webpack 错误:第 3 方 gem 无法解析 jQuery【英文标题】:Rails webpack error: 3rd party gem cannot resolve jQuery 【发布时间】:2020-09-05 21:18:29 【问题描述】:

我有一个第三方 gem,thredded,当我在 application.js 中需要它时,它会尝试访问 jQuery。 当我将它加载到我的 application.js 中时,如下所示,出现错误。

require("thredded_imports.js")
import jQuery from "jquery";

我得到的错误是:

Module not found: Error: Can't resolve 'jquery' in 'C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems\thredded-0.16.16\app\assets\javascripts\thredded\components'

问题似乎是 Webpack 无法访问我的 node_modules 文件夹,因为我在路径中的不同文件夹中收到了其中一些不是 node_modules 的消息

C:\Ruby26-x64\lib\ruby\gems\2.6.0\gems\thredded-0.16.16\app\assets\javascripts\thredded\components\node_modules doesn't exist or is not a directory

我尝试配置我的 webpack.config.js 以添加 node_modules,但它似乎不起作用。有什么想法吗?

webpack.config.js

module.exports = env => 
    let prod = env !== undefined && env.production === true;
    return 
        devtool: prod ? 'source-map' : 'eval-cheap-module-source-map',

        entry: 
            'app': 'app.js',
            'sign-up': 'sign-up.js'   
        ,

        devServer: 
            contentBase: './dist',
            index: 'event-create.html'
        ,

        externals: 
            // require("jquery") is external and available
            //  on the global var jQuery
                'jquery': 'jQuery'
        ,

        resolve: 
                modules: [
                "node_modules",
                path.resolve(__dirname, '..', 'node_modules')
                ],
                alias: 
                        jquery: 'jquery/src/jquery',
                
        ,

        output: 
            path: path.resolve(__dirname, 'dist/'), 
            filename: prod ? "js/[name].[chunkhash].js" : "js/[name].js"
        ,

    

环境.js

const  environment  = require('@rails/webpacker')
const erb = require('./loaders/erb')

const webpack = require('webpack');
environment.plugins.append('Provide', new webpack.ProvidePlugin(
  $: 'jquery',
  jQuery: 'jquery',
    Popper: ['popper.js', 'default']
))

environment.loaders.append('expose', 
  test: require.resolve('jquery'),
  use: [
    loader: 'expose-loader',
    options: '$'
  , 
    loader: 'expose-loader',
    options: 'jQuery',
  ]
)

environment.loaders.prepend('erb', erb)
module.exports = environment

package.json

 "dependencies": 
    "@fortawesome/fontawesome-free": "^5.11.2",
    "@popperjs/core": "^2.3.3",
    "@rails/actioncable": "^6.0.0",
    "@rails/actiontext": "6.0.2-1",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "4.2.2",
    "ahoy.js": "^0.3.5",
    "bootstrap": "^4.4.1",
    "chart.js": "^2.9.3",
    "chartkick": "^3.2.0",
    "jquery": "^3.5.1",
    "jquery-ujs": "^1.2.2",
    "local-time": "^2.1.0",
    "popper.js": "^1.14.1",
    "quill": "^1.3.6",
    "rails-erb-loader": "^5.5.2",
    "trix": "1.0.0",
    "turbolinks": "^5.2.0",
    "webpack": "^4.42.1",
    "webpack-cli": "^3.3.11"
  ,

【问题讨论】:

【参考方案1】:

通过在我的 environment.js 中明确设置路径来解决这个问题

const path = require('path');

const webpack = require('webpack');
environment.plugins.append('Provide', new webpack.ProvidePlugin(
  $: 'jquery',
  jQuery: path.resolve(path.join(__dirname, '../../node_modules', 'jquery')),
    Popper: ['popper.js', 'default']
))

【讨论】:

这为我节省了大量时间。在遵循 Thredded 对带有 webpacker 的 Rails 6 的说明后,Webpack 编译挂起。谢谢!【参考方案2】:

我猜你在 environment.js 中缺少以下内容,在 exports 之前:

environment.loaders.append('expose', 
  test: require.resolve('jquery'),
  use: [
    loader: 'expose-loader',
    options: '$'
  , 
    loader: 'expose-loader',
    options: 'jQuery',
  ]
)

npm install expose-loader,为了暴露jQuery。

希望对您有所帮助!

【讨论】:

很遗憾没用。我已经发布了完整的 environment.js【参考方案3】:

也可以使用require.resolve("jquery")获取绝对路径

const webpack = require('webpack');
environment.plugins.append('Provide', new webpack.ProvidePlugin(
  $:      require.resolve("jquery"),
  jQuery: require.resolve("jquery")
))

【讨论】:

以上是关于Rails webpack 错误:第 3 方 gem 无法解析 jQuery的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5.2 和 webpacker 3.4.3:部署到 Heroku 时资产未编译

运行rails应用程序时出现webpacker错误。 'TypeError:environment.plugins.set不是函数'

带有 Rails(webpacker)的 Vue 错误:“无法获取 /”

带有 Webpack 和 Yarn 的 Rails 6 上的 ActionController 路由错误

如何使用 Tailwind CSS 读取和解决 Rails 中的 Webpack 错误?

Rails 6 + Webpacker:未捕获的类型错误:$(...).select2 不是函数