新手问题 rails 6 boostrap 尝鲜

syutran · 2019年08月28日 · 最后由 syutran 回复于 2019年08月28日 · 3563 次阅读

为了使用富文本,决定 DEMO 下 Rails 6。比着几位兄台关于 webpack 在 Rails 6 上的实例,搞了一把。发现有些地方不准确,特别是 bootstrap 部分。应该是这样的:

1、创建 APP

rails new loans -d mysql

2、安装 boostrap jquery 和 popper.js

yarn add bootstrap jquery popper.js

3、在 config/webpack/environment.js 中添加

# config/webpack/environment.js
......
const webpack = require('webpack')
environment.plugins.append( "Provide", new webpack.ProvidePlugin({
    $: 'jquery', 
    jQuery: 'jquery',
    Popper: ['popper.js', 'default'] 
  }))
......

4、在 app/javascript/packs/application.js 中添加

#app/javascript/packs/application.js
......
import "bootstrap"
import "../styles/application"

document.addEventListener("turbolinks:load",() => { 
  $('[data-toggle="tooltip"]').tooltip()
  $('[data-toggle="popover"]').popover() 
})
......

5、在 app/javascript/styles/application.scss 中添加

#app/javascript/styles/application.scss
......
@import 'bootstrap/scss/bootstrap'; 
@import 'fontawesome/scss/fontawesome';
......

以上的初始配置算是完成了,加个 Navbar 试试

6、在 application.html.erb 中加上 bootstrap 的菜单

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">Link</a>
      </li>
      <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          Dropdown
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
          <a class="dropdown-item" href="#">Action</a>
          <a class="dropdown-item" href="#">Another action</a>
          <div class="dropdown-divider"></div>
          <a class="dropdown-item" href="#">Something else here</a>
        </div>
      </li>
      <li class="nav-item">
        <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
      </li>
    </ul>
    <form class="form-inline my-2 my-lg-0">
      <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
    </form>
  </div>
</nav>

以上资料,GG 半天也大搭,百度更白痴,最后在 YT 上找到了一片资料。希望给和我一样刚入门的家伙们节省一点时间。 哦,忘说了,那个 font-awesome 我也没搞定,搜遍全世界也没有只言片语。

为什么百度不是 BD?这样排比更震撼

正好我也在尝试 Rails6. 有两个关于前端的问题没有搞明白,也没有找到相关的文档说明。

app/javascript/packs/application.js
......
import "bootstrap"

这个是怎么样找到 node_modules 中的对应 JS 文件。 我自己是写成这样的:require("bootstrap/dist/js/bootstrap"),所以想知道 /dist/js 是约定的吗?

第二个是在 scss 文件里 @import "~bootstrap/scss/bootstrap"; 这个 ~符号是干什么的?哪里有相关说明。

jingreen889 回复

这个是怎么样找到 node_modules 中的对应 JS 文件。我自己是写成这样的:require("bootstrap/dist/js/bootstrap"),所以想知道 /dist/js 是约定的吗?

这不是约定,是因为 bootstrap 的目录结构就这样,你可以打开 node_modules 自己看看

第二个是在 scss 文件里 @import "~bootstrap/scss/bootstrap"; 这个 ~符号是干什么的?哪里有相关说明。

https://segmentfault.com/a/1190000006628546 随便搜搜就好了嘛,关键词 webpack import 波浪线

理论上按我的 https://ruby-china.org/topics/38214 折腾应该不会有啥问题,包括 font-awesome 我都演示过怎么搞了,你的 3 和 4 都应该是不需要的

jasl 回复

我的第一个问题是:为什么import "bootstrap" 最后它能找到 Rails 工程中的 node_modules/bootstrap/dist/js/bootstrap.js 文件?因为我自己使用 npm 中的某一个包时,都是展开 node_modules 中的包的目录的结构,了解清楚,然后去 require 相应的文件。所以我看到 import "bootstrap" 这样简写才有这个疑惑。

jingreen889 回复

package.json 里面这行:

"main": "dist/js/bootstrap.js"
jingreen889 回复

这个不是 ruby 或者 rails 的事,这是 js 包管理的设计,rei 的答案是正解

原来如此,谢谢你们解决我的大疑惑。自从 Rails 与前端结合得越来越紧密了,我发现我变得不自信了。js 真是来事。

用 webpacker 要同时了解 webpack 本身的配置和 webpacker 的默认配置,目前资料较少,需要大家一起踩坑总结。

jasl 回复

我也疑惑第 3 和第 4,是因为这不符合 rails 的风格。但我的 DEMO 里如果不加这几行,bootstrrap 没效果。 用加 boostrap 同样的方法,加 font-awesome/scss/font-awesome,怎么都搞不定。晚上再拜读一遍您那贴子。

lukefan 稍微折腾了一下 FontAwesome 提及了此话题。 12月25日 14:43
需要 登录 后方可回复, 如果你还没有账号请 注册新账号