조건부로 require
모듈을 컴파일 할 때 런타임에 번들되기 때문에 browserify가있는 모듈을 사용할 수 없다는 것을 알고 있습니다. 조건부 스트립 모듈은 어떨까요?조건부 컴파일/require는 browserify (데드 코드 제거)를 사용합니다.
이미지 갤러리를 만들 수있는 앱이 있다고 가정 해 보겠습니다. 갤러리는 또한 편집 할 수 있습니다 (이미지 순서 변경 등). 그러나 갤러리의 렌더링과 편집은 결합되어 완전히 분리 될 수 없습니다. 그러나 갤러리를 배포하기 위해 편집 기능이 필요하지 않으며 어떤 모듈이 사용되는지 알고 있습니다. 두 가지 다른 번들을 만들고 싶습니다. 하나는 편집 기능이 있고 다른 하나는 편집 코드의 대부분을 제거하지 않고 만드는 것입니다. 내가 한 것은 envify
과 uglify의 dead code 제거를 사용하여 더 작은 번들에서 내 코드를 제외시키는 것입니다.
전 (thing.js) (thing.js) 후
//...some code that only the editor needs...
module.exports = thing;
if(process.env.INCLUDE_EDITOR === 'yes') {
//...some code that only the editor needs...
module.exports = thing;
}
이 잘 작동하고 편집기 번들이 이미 작다. 그리고 나는 다른 번들이 결코 thing
의 기능을 사용하지 않을 것이므로, 아무 것도 내보내지 않고 빈 모듈을 가지고도 괜찮습니다.
이제 문제가 있습니다. thing.js
에 모듈이 필요하다면 (예 : pica
), 불필요한 코드 제거 이후 아무도 사용하지 않아도 번들로 제공됩니다 ().
전 (thing.js) (thing.js) 후
var pica = require('pica');
//...some code that uses pica...
module.exports = thing;
if(process.env.INCLUDE_EDITOR === 'yes') {
var pica = require('pica');
//...some code that uses pica...
module.exports = thing;
}
그것을 요약하면 : 내 번들은 이제 pica
라이브러리를 포함하고 있지만, 아무도 그것을 필요로하지 않습니다. 필요한 코드는 죽은 코드 였지만, uglify는 분명히 pica
을 제거 할 수 있다는 것을 이해할 수 없습니다.
아마도''factor-bundle' (https://github.com/substack/factor-bundle)이 유용할까요? – casr
@casr 감사합니다! 나는 그것이 여기에 적용될 수 있다고 생각하지 않는다. 문서에서 예제를 보았을 때,'console.log (z (5) * w (2));가 절대 실행되지 않는다는 것을 알고 있기 때문에 번들 x에서 w와 z를 제거하는 것이 좋습니다. 그것은 여전히 묶음에있을 것입니다. 나는 어리석은 미친 일을 여기에서하는 종류 다. 하지만 이봐, 나는 비 편집기 번들에서 20 %를 제거했다! – Prinzhorn