파이썬 Flask에서 RequireJS Optimizer를 이용한 static폴더 최적화.
자바스크립트MVC를 이용할 경우 자바스크립트와 뷰 템플릿때문에 static폴더가 무겁습니다.
파일의 공백을 모두 제거하여 용량을 줄이면 좀 가벼워 지지요.
허나 파일 공백을 없애면 가독성이 떨어집니다.
난감한 상황이 발생해요.
길이 1m짜리 한줄코드를 고치고 기능 추가하는건 어렵잖아요?
변경이 빈번하게 일어나는 static 폴더.
개발 편의와 성능 두마리 토끼를 잡을 좋은 수가 없을까요?
RequireJS를 이용해 자바스크립트를 관리하신다면 방법이 있습니다!
우선 노드JS(http://nodejs.org)를 설치합니다.
RequireJS Optimizer를 설치합니다.
npm install -g requirejs
3. r.js를 다운로드 받습니다.(http://requirejs.org/docs/release/2.1.8/r.js)
4. 예제에서 사용할 어플리케이션 디렉토리 구조는 다음과 같습니다.
/build - r.js - build.js /application __init__.py /static /views template.ejs /js app.js /vendor jquery-1.10.1.min.js bootstrap.min
application/init.py
from flask import Flask
app = Flask(__name__)
# static 폴더 경로를 지정해 줍니다. debug일땐 ‘static’폴더로 경로를 설정하고 나머지는 ‘static-build’를 경로로 잡습니다.
app.static_folder = 'static-build'
if app.debug:
app.static_folder = 'static'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
application/static/js/app.js
자바스크립트 어플리케이션 파일입니다.
requirejs의 기본 설정을 담고 있습니다.
require.config({
"baseUrl": "/static/js",
"paths": {
"jquery": [
"//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min",
"vendor/jquery-1.10.1.min"
],
"jquery.bootstrap": [
"//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min",
"vendor/bootstrap.min"
],
},
shim: {
"jquery.bootstrap": {
deps: ["jquery"],
exports: '$.fn.bootstrap'
},
enforceDefine: true
}
});
requirejs(['jquery','jquery.bootstrap'],
function ($) {
// 어플리케이션 코드
}
);
/build/build.js
RequireJS용 build파일입니다.
{
appDir: '../application/static',
baseUrl: 'js/vendor',
mainConfigFile: '../application/static/js/app.js',
paths: {
"jquery": "jquery-1.10.1.min",
"jquery.bootstrap": "bootstrap.min",
},
dir: '../application/static-build',
optimize: "uglify2",
optimizeCss: "standard.keepLines",
removeCombined: true, // combine된 파일은 남겨두지 않습니다.
preserveLicenseComments: false,
modules: [
{
name: '../app'
}
]
}
프로젝트 루트 페이지에서 다음을 실행합니다.
JS/CSS파일을 최적화 하여 application/static-build 폴더에 저장합니다.
node ./build/r.js -o ./build/build.js
단 이는 js와 css만 최적화를 해 주기 때문에 Ejs 템플릿도 용량을 줄이려면 아래 커맨드를 이용하면 됩니다.
find ./application/static-build/views -name '*.ejs' -exec sed -i '/^\s∗\/\//d' {} \;
find ./application/static-build/views -name '*.ejs' -exec sed -i 's/^[ \t]*//g; s/[ \t]*$//g;' {} \;
find ./application/static-build/views -name '*.ejs' -exec sed -i ':a;N;$!ba;s/\n/ /g' {} \;
쉘 스크립트를 작성해 한번에 실행하면 간편합니다.
optimizer.sh
#!/bin/sh
cd './build'
node ./r.js -o build.js
cd '../application/static-build/views'
find . -name '*.ejs' -exec sed -i '/^\s∗\/\//d' {} \;
find . -name '*.ejs' -exec sed -i 's/^[ \t]*//g; s/[ \t]*$//g;' {} \;
find . -name '*.ejs' -exec sed -i ':a;N;$!ba;s/\n/ /g' {} \;
참고 자료
- RequireJS Optimizer ( http://requirejs.org/docs/optimization.html)
- SED로 html 용량 줄이기 (http://blog.keyboardplaying.org/2012/12/02/minify-html-using-sed/)
by 月風