当前位置: 首页 > 知识库问答 >
问题:

在Rails应用程序中使用Webpack 2在.js.erb视图中未定义$

司空健
2023-03-14
const path = require('path')
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const jsOutputTemplate = 'javascripts/[name].js'
const cssOutputTemplate = 'stylesheets/[name].css'

module.exports = {
  context: path.join(__dirname, '/app/assets'),
  entry: {
    application: ['./javascripts/application.js', './stylesheets/application.scss']
  },
  output: {
    path: path.join(__dirname, '/public'),
    filename: jsOutputTemplate
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: ['es2015']
        }
      },
      {
        test: /\.css$/,
        use: ExtractTextPlugin.extract(['css-loader', 'resolve-url-loader'])
      },
      {
        test: /\.s(a|c)ss$/,
        use: ExtractTextPlugin.extract(['css-loader', 'resolve-url-loader', 'sass-loader?sourceMap'])
      },
      {
        test: /\.(woff2?|svg)$/,
        use: 'url-loader?limit=10000&name=/fonts/[name].[ext]'
      },
      {
        test: /\.(ttf|eot)$/,
        use: 'file-loader?name=/fonts/[name].[ext]'
      },
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        use: 'url-loader?limit=10000&name=/images/[name].[ext]'
      },
      {
        test: /\.erb$/,
        enforce: 'pre',
        use: 'rails-erb-loader'
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin({
      filename: cssOutputTemplate,
      allChunks: true
    }),
    new webpack.ProvidePlugin({
      $: 'jquery',
      '$': 'jquery',
      'window.$': 'jquery',
      jQuery: 'jquery',
      'jQuery': 'jquery',
      'window.jQuery': 'jquery',
      jquery: 'jquery',
      'jquery': 'jquery',
      'window.jquery': 'jquery'
    })
  ]
}
require('jquery');
require('jquery-ui');
require('jquery-ujs');
require('jquery-datepicker');

正如您所看到的,我已经将rails-erb-loader用于.erb文件,但它并不像我预期的那样工作。当.js.erb文件呈现时,我总是在控制台中收到下一个错误:

Uncaught ReferenceError: $ is not defined

这个文件中的代码并不是什么花哨的东西,只是包含了一些调用jQuery的$函数的JS:

let $messagesArea = $('#js-attachments-messages');

但是,在控制台中,即使在.js.erb开头使用调试器,也会在打印时定义$:

function $(selector, [startNode]) { [Command Line API] } 
new webpack.ProvidePlugin({
  $: 'jquery',
  '$': 'jquery',
  'window.$': 'jquery',
  jQuery: 'jquery',
  'jQuery': 'jquery',
  'window.jQuery': 'jquery',
  jquery: 'jquery',
  'jquery': 'jquery',
  'window.jquery': 'jquery'
})

如果能帮助解决这个问题,我们将不胜感激。

更新

package.json的内容如下:

{
  "devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-polyfill": "^6.23.0",
    "babel-preset-es2015": "^6.24.1",
    "compression-webpack-plugin": "^0.4.0",
    "css-loader": "^0.28.0",
    "expose-loader": "^0.7.3",
    "extract-text-webpack-plugin": "^2.1.0",
    "file-loader": "^0.11.1",
    "imports-loader": "^0.7.1",
    "node-sass": "^4.5.2",
    "rails-erb-loader": "^5.0.0",
    "resolve-url-loader": "^2.0.2",
    "sass-loader": "^6.0.3",
    "style-loader": "^0.16.1",
    "url-loader": "^0.5.8",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.4"
  },
  "dependencies": {
    // ...
    "jquery": "^3.2.1",
    "jquery-datepicker": "^1.11.5",
    "jquery-ui": "^1.12.1",
    "jquery-ujs": "^1.2.2",
    // ...
  }
}

共有1个答案

华萧迟
2023-03-14

我最近遇到了一个类似的错误,原因是Webpack中所需的jQuery没有在我应用程序视图文件夹中公开,因此在我的js.erb文件中不可见。通过全局公开jQuery,在app/javascript/packs/application.js中添加以下2行,解决了这个问题:

从“jQuery”导入$;

global.$=jQuery;

 类似资料:
  • 问题内容: 我在使用以下声明与Rails 3.1应用程序一起使用时遇到麻烦。我将字体放在Asset Pipeline中的资产文件夹中,并与and 一起放置在其自己的文件夹“ Fonts”中。 这是我使用的声明(由Font Squirrel生成)。 任何人都可以在其Rails 3.1应用程序上成功使用@ font-face吗? 更新资料 我刚刚阅读了该线程,声明中更改为。不幸的是,这似乎也不起作用。

  • 我正在另一台服务器上使用远程PostgreSQL,希望将Rails应用程序部署到AWS。我想让AWS与远程PostgreSQL数据库服务器通信。 我得到了一个错误: 致命:用户"postgres"的对等验证失败 虽然我在 我是如何被列入白名单的? 我在AWS控制台中看到了公共IP,并添加了它。我已经ping了我的AWS站点并添加了该IP。

  • 过去几天我一直在尝试在我的Windows PC上安装Rails。我从www.railsinstaller那里得到了这个包裹。org,它安装得很好。创建新应用程序时,我可以看到所有应用程序文件都已创建,然后出现以下错误: DL已弃用,请使用FIDLE从中获取gem元数据https://rubygems.org/..........正在解析依赖项。。。Gem::RemoteFetcher::Fetch

  • 这里是Dockerfile 和docker-compose.yml (对于ssh->在flow this链接https://docs.docker.com/engine/examples/running_ssh_service/) 3000/TCP->0.0.0.0:3000 将ssh连接到容器 ssh root@localhost-p 32768 通过删除docker-compose.yml中的

  • 问题内容: 假设您位于用户控制器中,并且想要获取显示请求的json响应,那么可以在您的views / users /目录中创建一个名为show.json的文件,并在用户之后#show操作完成后,它将呈现文件。 当前,您需要执行以下操作: 但是,如果您可以创建一个show.json文件,它会像这样自动呈现,那就太好了: 这将为我节省大量的痛苦,并且会消除我在控制器中渲染json时得到的那种可怕的肮脏

  • 问题内容: 我有一个Rails应用程序在开发环境中的docker容器中运行。 当我尝试通过在代码中放置某个地方并将其附加到容器上来对其进行调试时,我可以在输出中看到提示,但提示不会暂停,并且无法像没有docker容器一样与之交互。 那么如何调试容器化应用程序? 问题答案: 如果您使用的是docker-compose,则可以将这些标志添加到: 然后使用附加到您的过程。现在在这里工作。确保在您的容器上