<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Tutorial Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/tag/tutorial/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Thu, 12 Oct 2023 01:39:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Tutorial Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/tag/tutorial/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cài đặt Rails 7 với Vite + Stimulus + Tailwind</title>
		<link>https://blog.tomosia.com.vn/cai-dat-rails-7-voi-vite-stimulus-tailwind/</link>
					<comments>https://blog.tomosia.com.vn/cai-dat-rails-7-voi-vite-stimulus-tailwind/#comments</comments>
		
		<dc:creator><![CDATA[Minh Tang]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 01:38:46 +0000</pubDate>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Tutorial]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1202</guid>

					<description><![CDATA[<p>Nếu bạn đang tìm kiếm một giải pháp phát triển web hiệu suất cao và tiện lợi, Vite sẽ là lựa chọn đáng xem xét. Còn với Rails 7, bạn sẽ phải cân nhắc xem tính năng importmap có đủ thuyết phục để bạn chuyển đổi không.</p>
<p>The post <a href="https://blog.tomosia.com.vn/cai-dat-rails-7-voi-vite-stimulus-tailwind/">Cài đặt Rails 7 với Vite + Stimulus + Tailwind</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Rails 7</strong> vừa chào đón sự xuất hiện của tính năng <code>importmap</code>, một tính năng đầy hứa hẹn giúp quản lý tài nguyên trên ứng dụng web dễ dàng hơn. Tuy nhiên Vite vẫn đang là một lựa chọn đáng chú ý trong cộng đồng phát triển web.</p>



<p class="wp-block-paragraph"><strong>Vite</strong> nổi bật với hai tính năng mà không ai có thể phủ nhận: <code>Instant Server Start</code> và <code>Lightning Fast HMR</code>.</p>



<ul class="wp-block-list">
<li><code>Instant Server Start</code> cho phép phục vụ tệp trên yêu cầu qua ESM, không cần đóng gói.</li>
</ul>



<ul class="wp-block-list">
<li><code>Lightning Fast HMR</code> là chức năng Hot Module Replacement (HMR) nhanh chóng</li>
</ul>



<p class="wp-block-paragraph">Điều đặc biệt là Vite sử dụng <code>esbuild</code>, một công cụ <code>pre-bundler</code> có tốc độ xử lý vượt trội, cùng với <code>rollup</code> để bundle mã nguồn. Kết hợp cả hai, sẽ tận dụng sức mạnh của chúng để cung cấp một trải nghiệm phát triển và triển khai web mạnh mẽ.</p>



<p class="wp-block-paragraph">Vậy nếu bạn đang tìm kiếm một giải pháp phát triển web hiệu suất cao và tiện lợi, Vite sẽ là lựa chọn đáng xem xét. Còn với Rails 7, bạn sẽ phải cân nhắc xem tính năng <code>importmap</code> có đủ thuyết phục để bạn chuyển đổi không.</p>



<h2 id="bat-dau-cai-dat-rails" class="wp-block-heading">Bắt Đầu: Cài Đặt Rails</h2>



<pre class="wp-block-code"><code>mkdir project_name &amp;&amp; cd project_name
rails new . --force --css=bootstrap --database=postgresql --minimal
rails db:create
rails db:migrate

// OR
echo "source '&lt;https://rubygems.org>'" > Gemfile
echo "gem 'rails', '7.1.0'" >> Gemfile
bundle install
bundle exec rails new . --force --css=bootstrap --database=postgresql --minimal
bin/rails db:create
bin/rails db:migrate
</code></pre>



<h2 id="buoc-1-cai-dat-vite" class="wp-block-heading">Bước 1: Cài Đặt Vite</h2>



<pre class="wp-block-code"><code>gem "vite_rails"
bundle install
bundle exec vite install

</code></pre>



<p class="wp-block-paragraph">Lệnh <code>vite install</code> sẽ tạo ra các tệp sau đây:</p>



<ul class="wp-block-list">
<li>Procfile cho môi trường phát triển để khởi chạy Rails và Vite:</li>
</ul>



<pre class="wp-block-code"><code>Procfile.dev
  vite: bin/vite dev
  web: bin/rails s</code></pre>



<ul class="wp-block-list">
<li>File entrypoint &#8211; Nơi chỉ chứa các lệnh imports</li>
</ul>



<pre class="wp-block-code"><code>app/javascript/entrypoints/</code></pre>



<ul class="wp-block-list">
<li>Tệp thực thi để bắt đầu vite:</li>
</ul>



<pre class="wp-block-code"><code>bin/vite</code></pre>



<ul class="wp-block-list">
<li>File cài đặt thư viện js</li>
</ul>



<pre class="wp-block-code"><code>package.json
package-lock.json</code></pre>



<ul class="wp-block-list">
<li>Cấu hình cho Vite cho ứng dụng:</li>
</ul>



<pre class="wp-block-code"><code>vite.config.ts
config/vite.json</code></pre>



<ul class="wp-block-list">
<li>Đặt cấu hình cho Vite:</li>
</ul>



<pre class="wp-block-code"><code># vite.config.ts

import { defineConfig } from 'vite'
import RubyPlugin from 'vite-plugin-ruby'
import FullReload from "vite-plugin-full-reload";

export default defineConfig({
  clearScreen: false,
  plugins: &#91;
    RubyPlugin(),
    FullReload(&#91;"config/routes.rb", "app/views/**/*"], { delay: 200 })
  ],
  root: "./app/assets",
  build: {
    manifest: true,
    rollupOptions: {
      input: "/app/javascript/entrypoints/application.js"
    }
  }
})</code></pre>



<p class="wp-block-paragraph">Vite cũng đi kèm với tính năng <code>auto build</code> . Vite-rails sẽ tự động phát hiện tùy chọn <code>"autoBuild": true</code> trong <code>vite.json</code>. Nếu có bất kỳ mã nào thay đổi trong thư mục được chỉ định trong <code>sourceCodeDir</code> và <code>watchAdditionalPaths</code>, nó sẽ tự động kích hoạt quá trình build tài nguyên</p>



<pre class="wp-block-code"><code># vite.json

{
  "all": {
    "sourceCodeDir": "app/javascript",
    "watchAdditionalPaths": &#91;]
  },
  "development": {
    "autoBuild": true,
    "publicOutputDir": "vite-dev",
    "port": 3036
  },
  "test": {
    "autoBuild": true,
    "publicOutputDir": "vite-test",
    "port": 3037
  }
}

</code></pre>



<p class="wp-block-paragraph">Vite xây dựng các tài nguyên và lưu trữ chúng trong <code>public/vite-dev</code> với các tệp CSS và JS được compile. Tệp <code>manifest.json</code> bao gồm các tệp CSS và JS cùng với tài nguyên từ <code>manifest-assets.json</code>.</p>



<pre class="wp-block-code"><code>Building with Vite ⚡️
vite v4.3.9 building for development...
transforming...

✓ 7 modules transformed.

rendering chunks...
computing gzip size...
../../public/vite-dev/manifest-assets.json              0.00 kB │ gzip:  0.02 kB
../../public/vite-dev/manifest.json                     0.30 kB │ gzip:  0.14 kB
../../public/vite-dev/assets/application-23aabef0.css   9.26 kB │ gzip:  2.39 kB
../../public/vite-dev/assets/application-cda856d1.js   43.44 kB │ gzip: 10.95 kB
✓ built in 481ms
Build with Vite complete: /Users/projects/app/public/vite-dev

</code></pre>



<p class="wp-block-paragraph">Bây giờ, sau khi khởi động lại Rails, bạn sẽ thấy những dòng thông báo này trên console của trình duyệt:</p>



<pre class="wp-block-code"><code>Vite ⚡️ Ruby
Visit the guide for more information: &lt;https://vite-ruby.netlify.app/guide/rails>

</code></pre>



<p class="wp-block-paragraph">Tất cả đã sẵn sàng để bạn viết chức năng JavaScript cho ứng dụng với Vite! 😃</p>



<h2 id="buoc-2-vite-stimulus" class="wp-block-heading">Bước 2: Vite + Stimulus</h2>



<p class="wp-block-paragraph">Vite có các plugin cho các framework như ReactJS và VueJS, cũng như một plugin cho framework Stimulus. Trong Rails 7, <code>gem 'stimulus-rails'</code> được cấu hình tự động. Vì vậy, để kết hợp Vite và Stimulus, hãy thực hiện các bước sau:</p>



<ul class="wp-block-list">
<li>Tạo các tệp Stimulus:</li>
</ul>



<pre class="wp-block-code"><code>gem 'stimulus-rails' # bỏ qua nếu đã được thêm bởi Rails
bundle install
rails stimulus:install # Tạo các tệp sau

</code></pre>



<ul class="wp-block-list">
<li>Rails đã thêm cài đặt cho Stimulus trong <code>app/javascript/controllers/application.js</code> và <code>app/javascript/controllers/index.js</code>. Vì chúng ta sẽ cấu hình Stimulus bằng Vite, bạn có thể bỏ qua tất cả các dòng từ hai tệp này.</li>



<li>Bỏ comment các import sau từ <code>app/javascript/application.js</code>:</li>
</ul>



<pre class="wp-block-code"><code>// import "@hotwired/turbo-rails"
// import "controllers"</code></pre>



<ul class="wp-block-list">
<li>Thêm hai plugin Vite mà bạn có thể sử dụng cho Stimulus:
<ul class="wp-block-list">
<li><code>stimulus-vite-helpers</code>: Cung cấp các helper để dễ dàng tải tất cả các controller Stimulus của bạn khi sử dụng Vite.js.</li>



<li><code>vite-plugin-stimulus-hmr</code>: HMR cho các controller Stimulus trong Vite.js.</li>
</ul>
</li>
</ul>



<pre class="wp-block-code"><code>yarn add -D @hotwired/stimulus
yarn add -D stimulus-vite-helpers
yarn add -D vite-plugin-stimulus-hmr</code></pre>



<p class="wp-block-paragraph">Câu lệnh trên sẽ thêm các phụ thuộc vào tệp <code>package.json</code>.</p>



<ul class="wp-block-list">
<li>Cấu hình Vite cho plugin HMR của Stimulus. Giờ đây, <code>vite.config.js</code> sẽ trông như sau:</li>
</ul>



<pre class="wp-block-code"><code>import { defineConfig } from 'vite'
import RubyPlugin from 'vite-plugin-ruby'
import FullReload from 'vite-plugin-full-reload';
import StimulusHMR from 'vite-plugin-stimulus-hmr';

export default defineConfig({
  clearScreen: false,
  plugins: &#91;
    RubyPlugin(),
    FullReload(&#91;"config/routes.rb", "app/views/**/*"], { delay: 200 }),
    StimulusHMR()
  ],
  root: "./app/assets",
  build: {
    manifest: true,
    rollupOptions: {
      input: "/app/javascript/entrypoints/application.js"
    }
  }
})</code></pre>



<ul class="wp-block-list">
<li>Thêm nội dung sau vào tệp <code>app/javascript/controllers/index.js</code>. Controllers Stimulus được đăng ký bằng cách sử dụng globEager của Vite và helper <code>registerControllers</code>.</li>
</ul>



<pre class="wp-block-code"><code>import { Application } from '@hotwired/stimulus'
import { registerControllers } from 'stimulus-vite-helpers'

const application = Application.start()
const controllers = import.meta.globEager('./**/*_controller.js')
registerControllers(application, controllers)</code></pre>



<ul class="wp-block-list">
<li>Import controller Stimulus vào tệp của Vite:</li>
</ul>



<p class="wp-block-paragraph">Thêm dòng sau vào <code>app/javascript/entrypoints/application.js</code>:</p>



<pre class="wp-block-code"><code>import '../controllers'</code></pre>



<ul class="wp-block-list">
<li>Để kiểm tra xem controller Stimulus &#8220;hello&#8221; hoạt động, thêm đoạn mã sau vào <code>app/views/layouts/application.html.erb</code>:</li>
</ul>



<pre class="wp-block-code"><code>&lt;div data-controller="hello">
  &lt;input data-hello-target="name" type="text">
  &lt;input data-hello-target="output" type="text">
  &lt;button data-action="click->hello#greet">Greet&lt;/button>
&lt;/div></code></pre>



<p class="wp-block-paragraph">Bạn đã sẵn sàng sử dụng Stimulus và Vite để phát triển ứng dụng của bạn!</p>



<h2 id="buoc-3-vite-tailwind" class="wp-block-heading">Bước 3: Vite + Tailwind</h2>



<ul class="wp-block-list">
<li>Sử dụng <code>yarn</code> để thêm Tailwind CSS và các gói cần thiết khác:</li>
</ul>



<pre class="wp-block-code"><code>yarn add -D tailwindcss @tailwindcss/forms @tailwindcss/typography @tailwindcss/aspect-ratio @tailwindcss/forms @tailwindcss/line-clamp autoprefixer
yarn add -D eslint prettier eslint-plugin-prettier eslint-config-prettier eslint-plugin-tailwindcss path</code></pre>



<ul class="wp-block-list">
<li>Tạo tệp cấu hình <code>tailwind.config.js</code> trong thư mục gốc của dự án:</li>
</ul>



<pre class="wp-block-code"><code>npx tailwindcss init</code></pre>



<p class="wp-block-paragraph">Thêm nội dung sau vào <code>tailwind.config.js</code>:</p>



<pre class="wp-block-code"><code>const colors = require('tailwindcss/colors')
const defaultTheme = require('tailwindcss/defaultTheme')

module.exports = {
  content: &#91;
    './app/helpers/**/*.rb',
    './app/assets/stylesheets/**/*.css',
    './app/views/**/*.{html,html.erb,erb}',
    './app/javascript/components/**/*.js',
  ],
  theme: {
    fontFamily: {
      'sans': &#91;"BlinkMacSystemFont", "Avenir Next", "Avenir",
        "Nimbus Sans L", "Roboto", "Noto Sans", "Segoe UI", "Arial", "Helvetica",
        "Helvetica Neue", "sans-serif"],
      'mono': &#91;"Consolas", "Menlo", "Monaco", "Andale Mono", "Ubuntu Mono", "monospace"]
    },
    extend: {},
  },
  corePlugins: {
    aspectRatio: false,
  },
  plugins: &#91;
    require('@tailwindcss/typography'),
    require('@tailwindcss/forms'),
    require('@tailwindcss/aspect-ratio'),
    require('@tailwindcss/line-clamp'),
  ],
}</code></pre>



<ul class="wp-block-list">
<li>Thay nội dung tệp <code>app/assets/stylesheets/application.css</code> bằng:</li>
</ul>



<pre class="wp-block-code"><code>@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";</code></pre>



<ul class="wp-block-list">
<li>Tạo tệp <code>application.css</code> trong thư mục <code>app/javascript/entrypoints/</code> và nhập các tệp stylesheet:</li>
</ul>



<pre class="wp-block-code"><code>@import "../../assets/stylesheets/application.css";</code></pre>



<ul class="wp-block-list">
<li>Tạo tệp cấu hình <code>postcss.config.js</code> trong thư mục gốc của dự án:</li>
</ul>



<pre class="wp-block-code"><code>touch postcss.config.js</code></pre>



<p class="wp-block-paragraph">Thêm nội dung sau vào <code>postcss.config.js</code>:</p>



<pre class="wp-block-code"><code>module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}</code></pre>



<ul class="wp-block-list">
<li>Trong <code>app/views/layouts/application.html.erb</code>, sử dụng các thẻ <code>vite_client_tag</code>, <code>vite_stylesheet_tag</code> và <code>vite_javascript_tag</code> thay vì các thẻ JS và CSS mặc định:</li>
</ul>



<pre class="wp-block-code"><code>&lt;%= csrf_meta_tags %>
&lt;%= csp_meta_tag %>

&lt;%= vite_client_tag %>
&lt;%= vite_stylesheet_tag 'application', data: { "turbo-track": "reload" } %>
&lt;%= vite_javascript_tag 'application' %></code></pre>



<ul class="wp-block-list">
<li>Hãy chắc chắn rằng các tài nguyên được biên dịch bằng cách xem F12 trình duyệt</li>
</ul>



<pre class="wp-block-code"><code>&lt;link rel="stylesheet" href="/vite-dev/assets/application-23aabef0.css" data-turbo-track="reload">
&lt;script src="/vite-dev/assets/application-cda856d1.js" crossorigin="anonymous" type="module">&lt;/script></code></pre>



<ul class="wp-block-list">
<li>Nếu cần, bạn có thể khởi chạy máy chủ Vite để áp dụng các kiểu Tailwind:</li>
</ul>



<pre class="wp-block-code"><code>bin/vite dev -clobber</code></pre>



<p class="wp-block-paragraph">Bạn đã sẵn sàng để viết mã JS và CSS cho ứng dụng của mình và để Vite đóng gói các tài nguyên này! 😄</p>



<p class="wp-block-paragraph"><em><a href="https://sasikala-r.medium.com/rails-7-with-vite-stimulus-tailwind-c3ecf2191ea9" data-type="link" data-id="https://sasikala-r.medium.com/rails-7-with-vite-stimulus-tailwind-c3ecf2191ea9">Nguồn tại Medium</a></em></p>
<p>The post <a href="https://blog.tomosia.com.vn/cai-dat-rails-7-voi-vite-stimulus-tailwind/">Cài đặt Rails 7 với Vite + Stimulus + Tailwind</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cai-dat-rails-7-voi-vite-stimulus-tailwind/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
	</channel>
</rss>
