Rails 6:如何通过 webpacker 添加 jquery-ui?

arn*_*las 9 jquery-ui ruby-on-rails webpacker ruby-on-rails-6

我目前正在尝试在我的应用程序中实现一个日期选择器,问题是没有关于如何jquery-ui-rails通过 webpacker添加gem 的文档。

可能还有另一种方法可以添加宝石或其他适合我需要的宝石?

Kal*_*man 23

您不再需要将 javascript 库添加为 gems(由捆绑器管理)。相反,您使用 yarn 添加它们,它们由 webpack 管理(通过将 webpacker gem 添加到 Gemfile 来启用)。

以下步骤对我有用,可以让 jquery-ui 在 Rails 6 中工作:

  1. 在终端上,在您的应用程序类型中:
yarn add jquery-ui-dist
Run Code Online (Sandbox Code Playgroud)
  1. 您的config/webpack/environment.js需求如下:
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery',
    jQuery: 'jquery'
  })
);

const aliasConfig = {
    'jquery': 'jquery-ui-dist/external/jquery/jquery.js',
    'jquery-ui': 'jquery-ui-dist/jquery-ui.js'
};

environment.config.set('resolve.alias', aliasConfig);

module.exports = environment
Run Code Online (Sandbox Code Playgroud)
  1. 重启你的 Rails 服务器

  2. 在 中application.html.erb,包括jquery-ui主题:

<!DOCTYPE html>
<html>
  <head>
    <title>Jquery UI Test</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

    <%= stylesheet_link_tag '//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/le-frog/jquery-ui.min.css' %>

    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)
  1. 现在,在您的 中app/javascript/packs/application.js,您可以使用jquery-ui

注意:如果您想在views文件夹中使用 jQuery ,请使其全局可用

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

// THIS IS MAKING jQuery AVAILABLE EVEN INSIDE Views FOLDER
global.$ = require("jquery")

require("jquery") // Don't really need to require this...
require("jquery-ui")

$(function(){
    // Plain jquery
    $('#fadeMe').fadeOut(5000);

    // jquery-ui
    const availableCities = ['Baltimore', 'New York'];
    $('#cityField').autocomplete( { source: availableCities } );
    $('#calendarField').datepicker( { dateFormat: 'yy-mm-dd' } );
})
Run Code Online (Sandbox Code Playgroud)

这将适用于如下所示的页面:

<div id='fadeMe'>I will fade</div>

City: <input type='text' id='cityField' />
Calendar: <input type='text' id='calendarField' />
Run Code Online (Sandbox Code Playgroud)

  • 只是想指出,对于新手来说,更新`config/webpack/environment.js`后需要重新启动rails服务器,否则这将不起作用。这个答案有效并帮助我解决了 jquery ui 的问题。在这里开发 Rails 6 应用程序。也为非常详细的答案点赞! (3认同)
  • 对我来说,当我更改 aliasConfig 时有效: const aliasConfig = { 'jquery': 'jquery/src/jquery', 'jquery-ui': 'jquery-ui-dist/jquery-ui.js' }; (2认同)

小智 6

这些答案都不适合我。这是我最终实现它的方式:

yarn add jquery
Run Code Online (Sandbox Code Playgroud)

然后

yarn add jquery-ui-dist
Run Code Online (Sandbox Code Playgroud)

在您的 app/javascript/packs/application.js 文件中:

// jquery
import $ from 'jquery';

global.$ = $
global.jQuery = $


require('jquery-ui');

// jquery-ui theme
require.context('file-loader?name=[path][name].[ext]&context=node_modules/jquery-ui-dist!jquery-ui-dist', true,    /jquery-ui\.css/ );
require.context('file-loader?name=[path][name].[ext]&context=node_modules/jquery-ui-dist!jquery-ui-dist', true,    /jquery-ui\.theme\.css/ );
Run Code Online (Sandbox Code Playgroud)

在 config/webpack/environment.js 中:

const { environment } = require('@rails/webpacker');

const webpack = require('webpack');


// resolve-url-loader must be used before sass-loader
environment.loaders.get('sass').use.splice(-1, 0, {
    loader: 'resolve-url-loader',
    options: {
        attempts: 1
    }
});


// Add an additional plugin of your choosing : ProvidePlugin

environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
        $: 'jquery',
        JQuery: 'jquery',
        jquery: 'jquery',
        'window.Tether': "tether",
        Popper: ['popper.js', 'default'], // for Bootstrap 4
    })
)

const aliasConfig = {
    'jquery': 'jquery/src/jquery',
    'jquery-ui': 'jquery-ui-dist/jquery-ui.js'

};

environment.config.set('resolve.alias', aliasConfig);

//
module.exports = environment;
Run Code Online (Sandbox Code Playgroud)

重新启动我的服务器使它对我来说工作正常。这是我用来使其工作的 webpacker 详细信息的链接:

https://gist.github.com/maxivak/2612fa987b9f9ed7cb53a88fcba247b3#jquery-jquery-ui