6

나는 browserify-rails을 사용하고 있습니다. sprockets 지시어가 포함 된 파일을 전처리하기 위해 스프로킷을 얻으려고합니다. 따라서 require() browserify를 사용하면 포함 할 것입니다. 생성 된 JavaScript.Browserify와 browserify-rails로 sprockets-preprocessed 파일 필요

sprockets 지시어는 클라이언트 측에서 Rails 경로에 액세스 할 수 있도록 js-routes이라는 출력을 포함하려고합니다.

system/ 
    rails_routes.js 
application.js 

application.js이 주 파일이며, 응용 프로그램의 나머지 부분을 실행합니다


은 ( app/assets/javascripts 이내) 내 설정입니다. 나는

var rr = require("./system/rails_routes.js"); 

과 같은 것을 할 수 있고, routes 객체에 접근 할 수 있기를 바란다. system/react_routes.js


, I는 다음 가지고

//= require js-routes 

console.log("Does this work?"); 

(AN 제쳐두고, I는 바와 같이, 그래서 CommonJS 모델에 적합하도록, module.exports라는 개체의 출력을 배치 js-routes 구성된 in railsware/js-routes#121)

유일한 문제는 생성 된 번들을 볼 때 스프로킷 지시문이 여전히 있으며 확장되지 않은 것입니다.

모듈을 호출하면 console.log 호출도 거기에 있으며 실행됩니다.

작동시키기위한 방법이 있습니까? 스프로킷은 파일을 browserify-rails로 묶기 전에 파일을 사전 처리하는 올바른 방법은 무엇입니까? 나는이 설정 내에서 작동 JS 경로를 내 프로젝트에 browserify 레일을 통합하고 만들기에 끝없는 시간을 보냈어요

답변

8

...

내가 와서 아래에서 설명하는 솔루션은 나를 톱니가 할 수없는 결과입니다 Browserify가 오기 전에 경로 파일을 미리 처리해야합니다. 나는 browserify-rails와 sprockets의 소스 코드에서 꽤 오랜 시간을 보냈지 만, 물건을 뒤집고 각 구성 요소를 올바른 순서로 작동시키는 방법을 찾을 수 없었습니다. 이게 작동합니다.

내 솔루션은 Rails 훅을 사용하여 개발 환경에서 완전한 JS 파일을 손으로 생성하여 루트가 항상 최신 Rails 경로 파일로 최신 상태로 유지되도록하는 것이 었습니다. 그런 다음 프로덕션 환경으로 푸시 할 때 JS 파일의 경로가 최신이라고 가정합니다.

환경 로딩을 수행하면 Sprockets/browserify가 소리 내기 전에 JS 파일이 준비되어 있는지 확인합니다. 단지 일반 JS 파일 일뿐입니다.

여기 development.rb에 포함하는 코드이다 :

ActionDispatch::Reloader.to_prepare do 
    Rails.application.reload_routes! 

    if JsRoutes.assert_usable_configuration! 
    JsRoutes.generate!(Rails.root.join('app/assets/javascripts/routes.js')) 
    end 
end 
당신은 항상 경로를 다시로드 할 수 있습니다

, 그렇지 않으면 생성 된 파일은 항상 레일 경로 파일의 마지막 상태로 두 번째를 나타냅니다. 왜 그런지 모르겠다.내 application.js에서

, 나는 그럼 그냥 모든 //= 지시를 제거하지만, jQuery를 것들은 (사용 가능한 글로벌 jQuery를 유지하기 위해), 그리고 browserify 내가 포함 할 파일을 선택 할 수 있도록 다른 모든 모듈에 대한 require 방법을 사용했다.

이것은 약간 해킹되지만 작동합니다.

Sprockets 파이프 라인에 대해 더 잘 알고있는 사람이 더 나은 솔루션을 제공 할 수 있는지 알고 싶습니다.

+1

이 솔루션에 대해 감사드립니다. 나는 그것이 효과가 있다는 것을 확인할 수있다! –

+0

다시 도움이 됨;) –