2015-06-14 12 views
17

Do tej pory korzystałem z livereload, więc za każdym razem, gdy zmieniam JS lub szablony, strona odświeża się, a kiedy zmieniam CSS, będzie to hotswap dla nowego CSS bez odświeżania.Wymiana modułu zastępczego: css bez odświeżania

Próbuję teraz Webpack i prawie doszło do tego samego zachowania, z jednym wyjątkiem: kiedy CSS się zmienia, odświeża całe okno. Czy możliwe jest wykonanie hotswap CSS bez odświeżania?

Config tej pory:

var webpackConfig = { 
    entry: ["webpack/hot/dev-server", __dirname + '/app/scripts/app.js'], 
    debug: true, 
    output: { 
     path: __dirname + '/app', 
     filename: 'scripts/build.js' 
    }, 
    devtool: 'source-map', 
    plugins: [ 
     new webpack.HotModuleReplacementPlugin(), 
     new htmlWebpackPlugin({ 
      template: __dirname + '/app/index.html', 
      inject: 'body', 
      hash: true, 
      config: config 
     }), 
     new webpack.ProvidePlugin({ 
      'angular': 'angular' 
     }), 
     new ExtractTextPlugin("styles.css") 
    ], 
    module: { 
     loaders: [ 
      { 
       test: /\.scss$/, 
       loader: "style!css!sass?includePaths[]=" + __dirname + "/app/bower_components/compass-mixins/lib&includePaths[]=" + __dirname + '/instance/sth/styles&includePaths[]=' + __dirname + '/app/scripts' 
      } 
     ] 
    } 
}; 

Odpowiedz

16

Jest to jedna z wad korzystania ExtractTextPlugin jak stwierdzono w the project README. Możesz rozwiązać ten problem, dzieląc konfigurację. To znaczy. mieć oddzielną konfigurację do rozwoju bez niej i jedną do produkcji z nią.

+1

Stworzyłem https://github.com/sheerun/extracted-loader, aby rozwiązać ten problem. – sheerun

4

Możliwe jest teraz użycie angular2, opakowania internetowego z wymianą gorącego modułu, sass sourcaaps i zewnętrznego css. Daje mi to wiele dni zabawy, ale udało mi się to zrobić!

zależności są style-loader, css-loader i sass-loader (w przypadku korzystania Sass, jeśli nie, to ładowarka Sass może być usunięty)

użyć ExtractTextPlugin w sposobie wytwarzania emitują odpowiednie pliki .css.

UWAGA: Aby to działało, nie używam właściwości stylesUrl, zamiast tego importuję plik .scss poza dekorator @ Component, aby style ładowały się w kontekście globalnym, a nie były ograniczone przez komponent.

Ta konfiguracja umożliwia wymianę modułu Hot z plikami SCSS przy użyciu serwera Webpack, a extracttextplugin w trybie produkcyjnym do emisji rzeczywistych plików .css.

Oto mój config roboczego

{ 
     test: /\.(scss)$/, 
     use: 
      isDevServer ? [ 
       { 
       loader: 'style-loader', 
       },    
       { 
       loader: 'css-loader', 
       options: { sourceMap: true } 
       }, 
       { 
       loader: 'postcss-loader', 
       options: { postcss: [AutoPrefixer(autoPrefixerOptions)], sourceMap: true } 
       }, 
       { 
       loader: 'sass-loader', 
       options: { sourceMap: true } 
       }, 
       { 
       loader: 'sass-resources-loader', 
       options: { 
        resources: [ 
        './src/assets/styles/variables.scss', 
        './src/assets/styles/mixins.scss'] 
       } 
       }, 
       /** 
       * The sass-vars-loader will convert the 'vars' property or any module.exports of 
       * a .JS or .JSON file into valid SASS and append to the beginning of each 
       * .scss file loaded. 
       * 
       * See: https://github.com/epegzz/sass-vars-loader 
       */ 
       { 
       loader: '@epegzz/sass-vars-loader?', 
       options: querystring.stringify({ 
        vars: JSON.stringify({ 
        susyIsDevServer: susyIsDevServer 
        }) 
       }) 
       }] : // dev mode 
      ExtractTextPlugin.extract({ 
      fallback: "css-loader", 
      use: [ 
       { 
       loader: 'css-loader', 
       options: { sourceMap: true } 
       }, 
       { 
       loader: 'postcss-loader', 
       options: { postcss: [AutoPrefixer(autoPrefixerOptions)], sourceMap: true } 
       }, 
       { 
       loader: 'sass-loader', 
       options: { sourceMap: true } 
       }, 
       { 
       loader: 'sass-resources-loader', 
       options: { 
        resources: [ 
        './src/assets/styles/variables.scss', 
        './src/assets/styles/mixins.scss'] 
       } 
       }, { 
       loader: '@epegzz/sass-vars-loader?', 
       options: querystring.stringify({ 
        vars: JSON.stringify({ 
        susyIsDevServer: susyIsDevServer 
        }) 
        // // Or use 'files" object to specify vars in an external .js or .json file 
        // files: [ 
        // path.resolve(helpers.paths.appRoot + '/assets/styles/sass-js-variables.js') 
        // ], 
       }) 
       }], 
      publicPath: '/' // 'string' override the publicPath setting for this loader 
      }) 
     }, 

Następnie w składniku, na przykład, app.component.ts, byś wymagać swój app.style.scss plików poza dekoratora @Component.

To jest podstęp. To nie zadziała, jeśli style "kątowe" zostaną wczytane z stylesUrl. Wykonanie tego w ten sposób pozwoli ci leniwym wczytać arkusze stylów dla składników, które są leniwie załadowane, dzięki czemu czas ładowania jest jeszcze szybszy.

app.component.css

/* 
* THIS IS WHERE WE REQUIRE CSS/SCSS FILES THAT THIS COMPONENT NEEDS 
* 
* Function: To enable so-called "Lazy Loading" CSS/SCSS files "on demand" as the app views need them. 
* Do NOT add styles the "Angular2 Way" in the @Component decorator ("styles" and "styleUrls" properties) 
*/ 
    import './app.style.scss' 

/** 
* AppComponent Component 
* Top Level Component 
*/ 
@Component({ 
    selector: 'body', 
    encapsulation: ViewEncapsulation.None, 
    host: { '[class.authenticated]': 'appState.state.isAuthenticated' }, 
    templateUrl: './app.template.html' 
}) 

miałem żadnych problemów z systemem tej konfiguracji. Proszę bardzo!

sass_sourcemaps _hmr _wds

Aktualizacja 08/2017: Poprawa config dla WebPacka 3+ wymagania schematu, a do pracy z kątowe 4 AOT kompilacji.

+0

Dziękujemy za wyczerpującą odpowiedź. Muszę go jeszcze wypróbować, co może trochę potrwać, ponieważ od jakiegoś czasu zaparkowaliśmy projekt na pakiet, ale twoja odpowiedź wygląda obiecująco! –

1

Chociaż ExtractTextPlugin stwierdza „No Hot Wymiana modułu” w swojej README section, naprawiłem to przez ręczne aktualizowanie plików CSS przez BrowserSync API.

Użyłem , aby odsłuchać zmiany w moich plikach CSS, a następnie użyć BrowserSync do ich aktualizacji.

npm install gaze 

Można również łatwo zrobić poprzez edycję skryptu build coś z następujących powodów:

const { Gaze } = require('gaze'); 

    // Your own BrowserSync init 
    browserSync.init({ 
    ... 
    }, resolve); 

    // Create a watcher: 
    // You can watch/reload specific files according to your build/project structure 
    const gaze = new Gaze('**/*.css'); 
    gaze.on('all',() => bs.reload('*.css')); 

nadzieję, że pomoże.

2

Jest to prosty sposób na zrobienie tego. Używam programu Sass-loader z wtyczką wypakowanego tekstu, która tworzy pliki css.

Co trzeba zrobić, to dodać identyfikator do css obejmują

<link id="js-style" type="text/css" rel="stylesheet" href="/static/main.css"> 

Teraz trzeba zapewnić podczas HMR dzieje zaktualizować url z aktualnej wersji/datownik. Możesz to zrobić w następujący sposób:

import '../style/main.scss' 
if (module.hot) { 
    module.hot.accept('../style/main.scss',() => { 
    const baseStyle = window.document.getElementById('js-style') 
    baseStyle.setAttribute('href', '/static/main.css?v=' + new Date().valueOf) 
    }) 
} 

Kiedy tylko css się zmieni, poprawimy URL css, aby go ponownie załadować.

Powiązane problemy