2017-12-11 10 views
0

내 4 각도 앱에서 테마 스타일을 지원하는 가장 좋은 방법을 찾고 있습니다. SASS 변수를 사용하고 테마 설정은 4 가지 SASS 변수 (기본 및 보조 색상, 배경 이미지 및 어두운/밝은 주제의 전환)에 의존합니다.production에서 angular4 앱을 다시 컴파일하는 방법은 무엇입니까?

이제 앱에서 테마를 동적으로 변경하고 싶습니다. 지금 당장이 있습니다 :

저는 sass-vars-loader 라이브러리 (https://github.com/epegzz/sass-vars-loader)를 사용하고 있습니다. 앱 빌드 중에 JSON 파일의 sass 변수를 내 _vars.scss에로드합니다. 그리고 구성 요소에서 해당 변수를 변경하면 JSON 파일에 새 값을 쓰고 해당 파일의 변경 사항을보고있는대로 앱을 다시 컴파일합니다.

이것은 개발 중에 _vars.scss에 성공적으로 새 변수를 다시 컴파일하고로드하는 것입니다.하지만 제 질문은이를 어떻게 프로덕션에서 지원할 수 있는지입니다.

webpack을 구성 할 수 있으려면 webpack.config.js를 $ng eject으로 꺼 냈으므로 더 이상 angular-cli 명령을 사용하지 마십시오.

// webpack.config.js 

... 

{ 
    "test": /\.scss$|\.sass$/, 
    "use": [ 
     "style-loader", 
     { 
     "loader": "css-loader", 
     "options": { 
      "sourceMap": false, 
      "importLoaders": 1 
     } 
     }, 
     { 
     "loader": "postcss-loader", 
     "options": { 
      "ident": "postcss", 
      "plugins": postcssPlugins 
     } 
     }, 
     { 
     "loader": "sass-loader", 
     "options": { 
      "sourceMap": false, 
      "precision": 8, 
      "includePaths": [] 
     } 
     }, 
     // Reads Sass vars from JSON 
     { loader: "@epegzz/sass-vars-loader", options: { 
     files: [ 
      path.resolve(__dirname, 'src/theme.json') 
     ] 
     } 
    } 
    ] 
    }, 

... 

"devServer": { 
setup: function(app) { 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ 
    extended: true 
    })); 

    app.post("/theme", function(req, res) { 
    var payload = req.body, 
     theme; 

    fs.writeFileSync('src/theme.json', JSON.stringify(payload, null, 3)); 
    res.send("Success"); 
    }); 
}, 
} 

나는 내 응용 프로그램을 제공하고 변화를 볼 것입니다 정의 Node.js를 서버를 만들 필요가 가정의 웹팩-dev에 서버 개발하는 동안하고있다처럼 jsut.

감사합니다. 감사합니다.

+0

webpack으로 모든 작업을 수행 할 필요가 없습니다. https://stackoverflow.com/a/40612500/2398593 – Maxime

+0

@Maxime 모든 응용 프로그램에서 sass 변수를 사용하고 있으며, 테마 변수는 동적이며 모든 색상이 될 수 있습니다. 응용 프로그램이 이미 컴파일 된 후 _vars.scss에 사용자가 선택한 값을 삽입하는 방법이 필요합니다. 당신이 제공하는 솔루션은 루트 구성 요소의 클래스를 확인하고 sass vars를 사용하여 모든 하위 구성 요소에서이를 수행해야합니다. – lginq

+0

모든 하위 구성 요소에있는 것은 아닙니다. 그 점은 – Maxime

답변

0

빌드 도구를 사용하는 전략을 다시 생각해 보시길 바랍니다. 원하는 결과를 얻으려면 서버를 구축해야한다고 생각하지 않습니다.

아마도 모든 테마를 컴파일하고 런타임에 '바꾸기'할 수 있습니다. Replacing css file on the fly (and apply the new style to the page)

테마가 고정되어 있지 않은 경우, 즉 조합 할 수있는 경우 기본 HTML 페이지에 'theme'CSS를 삽입하고 필요에 따라 해당 값을 스왑 할 수 있습니다. Change CSS rule at runtime

--- 편집 ---

나는 완전히 당신의 응용 프로그램 라이프 사이클이 시점에서 주요 설계 변경을해야하는 협박이야 이해하지만 현재의 접근 방식에가는 것을 매우 확신 signifigantly 더 두통을 일으킬 수 있습니다.

각도, SCSS, 노드 등은 사용자가 설명하는 시나리오를위한 것이 아니며 자신에게 적합하지 않습니다.

당신이 설명하는 시나리오에서 알고 계십니까? 어떤 사용자가 '테마 변경'을 유발하면 웹 사이트는 다시 컴파일되는 동안 웹 사이트가 '오프라인으로 전환'되고 해당 CSS 테마가 사이트를 사용하는 모든 사용자에게 표시됩니다.

또한 브라우저에서 scss 파일을 사용하고 있지 않으며, ng4의 경우를 믿는 모든 SCSS 파일의 컴파일 된 출력을 사용하고 있으며 CSS가 포함 된 JS 파일입니다.

각도를 다시 컴파일하지 않고 (많은 추가 백 엔드 서버 작업이 필요하며 잠재적으로 더 복잡한/안정성 문제가 발생할 수 있음) 제안하려면 vars를 가져와 채워야합니다. SCSS 파일을 다른 모든 SCSS 파일과 결합하여 앵귤러 CLI가 CSS 내장 JS 파일을 생성 한 다음이를 브라우저로로드하여 초기 파일을 대체하는 방법을 복제하고 자바 스크립트/브라우저에서 실행중인 타이프 크립트.

앱을 조금 새로 디자인하고 CSS 오버레이 파일을 만들고 런타임에 값을 바꿔 DOM에로드하여 테마를 변경하십시오. 다른 사람들도 여기에 무게를 실어 줄 것이라고 확신하지만 가능한 한 빨리 원하는 결과를 얻으려면 계속 진행하는 것이 더 좋은 방향이라고 생각합니다.

+0

앱이 이미 너무 크고 다른 방법으로 앱 디자인과 스타일을 크게 변경해야하므로이 종류의 빌드를 사용해야합니다. 값은 동적이므로 index.html에 포함 할 수 없으며 사용자가 새 값을 선택하고 전송할 때까지 사용할 수 없습니다. 아이디어는 파일에서 vars를 읽은 다음 vars.scss에 삽입하고 새 값을 선택하면 앱이 새로운 값으로 다시 컴파일되도록 트리거합니다. @Liam Flemming – lginq

+0

당신의 답을 받아 들일 수있는 방법입니다. – lginq