2017-06-26 33 views
1

我使用Webpacker v2運行Rails v5。到目前爲止,一切都很順利,但我遇到了一個問題:如何將Rails助手暴露給我的TypeScript。將Rails Env公開給Webpacker

我知道Webpacker附帶軌-ERB-裝載機,所以我期待,我會能夠添加.erb到打字稿文件,然後導入其他地方文件:

// app/javascript/utils/rails.ts.erb 
export const env = "<%= Rails.env %>" 

export function isEnv(envName: string) { 
    return env == envName 
} 

// app/javascript/packs/application.ts 
import { env } from "../utils/rails" 

不過的WebPack能「找不到了‘軌道’文件,即使我修改打字稿裝載機包括ERB文件:

module.exports = { 
    test: /.ts(\.erb)?$/, 
    loader: 'ts-loader' 
} 

我看到的是:

error TS2307: Cannot find module '../utils/rails'. 

將Rails助手和變量暴露給我的JavaScript的最佳方式是什麼?

回答

2

Rails env來自您的環境變量。這意味着您可以通過這種方式設置(在bash爲例)的變量進行配置:

export RAILS_ENV=production 

因此,你不需要在所有處理軌。

// app/javascript/utils/rails.ts.erb 
export const env = process.env.RAILS_ENV || "development" 

export function isEnv(envName: string) { 
    return env == envName 
} 

這帶有很大的優勢:你沒有加載整個Rails應用程序只是爲了編譯JavaScript的。如果你的應用程序增長,Rails在第一次加載時會變得非常慢。

既然你將不能訪問process.env在前端(瀏覽器),你還需要一個方法,使之存在。在的WebPack,這是通過DefinePlugin完成:

更新您的WebPack配置使用的插件(在plugins部分):new webpack.DefinePlugin({ "process.env": { RAILS_ENV: process.env.RAILS_ENV } }),你會得到一個process.env.RAILS_ENV可在客戶端

+0

你到什麼......但Web客戶端無法訪問'process.env'(VM265:1 Uncaught ReferenceError:未定義進程)也許有一些方法可以對其進行預處理? – fny

+0

你說的webpacker,所以我假設你在談論nodejs。如果是這種情況,請更新您的webpack配置以使用插件'DefinePlugin'(https://gist.github.com/haf/f671f1113d2c5dead5a7#file-gistfile1-txt-L109-L113),像'new webpack.DefinePlugin ({「process.env」:{RAILS_ENV:process.env.RAILS_ENV}})'你將在客戶端獲得一個'process.env.RAILS_ENV' –

+0

完美!你能爲後人的緣故更新你的答案嗎? – fny