如何使用 webpack、typescript、phaser 和 angular 配置全局 css 和 sass 样式表

Posted

技术标签:

【中文标题】如何使用 webpack、typescript、phaser 和 angular 配置全局 css 和 sass 样式表【英文标题】:How to configure global css and sass stylesheet with webpack, typescript, phaser and angular 【发布时间】:2018-09-05 20:31:24 【问题描述】:

以下配置是手工制作的,以支持标题中给出的所有技术(webpack、typescript、phaser 和 angular)。

它非常适合 Angular 组件样式表。但看起来不可能包含全局样式表。以下是相关配置文件:

html 文件:

<!-- src/index.html -->
<!DOCTYPE html>
<html>
  <head>
    <base href="/">
    <meta charset="UTF-8">
    <!-- it's included here! -->
    <link rel="stylesheet" href="styles/main.css">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <app-root></app-root>
  </body>
</html>

CSS 文件:

/*
src/styles/main.css
This file is correctly loaded in dev environment. When I build the project it disapear. :(
*/
body 
    background: #253050 url('../assets/design/main_background.jpg') no-repeat center;

和webpack配置:

// config/webpack.common.js
'use strict';

var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
const path = require('path');
var helpers = require('./helpers');

var distDir = path.resolve(__dirname, '../dist');

// Phaser webpack config
const phaserModule = path.join(__dirname, '/../node_modules/phaser-ce/');
const phaser = path.join(phaserModule, 'build/custom/phaser-split.js');
const pixi = path.join(phaserModule, 'build/custom/pixi.js');
const p2 = path.join(phaserModule, 'build/custom/p2.js');

module.exports = 
    entry: 
        'polyfills': './src/polyfills.ts',
        "app": "./src/main.ts"
    ,

    // What files webpack will manage
    resolve: 
        extensions: ['.js', '.ts', '.tsx'],
        alias: 
            'phaser': phaser,
            'pixi': pixi,
            'p2': p2
        
    ,
    output: 
        path: distDir,
        filename: '[name]_bundle.js'
    ,

    module: 
        rules: [
             test: /assets(\/|\\)/, use: [ 'file-loader' ] ,
            
                test: /\.tsx?$/,
                // ts-loader loads typescript files
                // angular2-template-loader is needed to load component templates
                loaders: ['ts-loader', 'angular2-template-loader'],
                exclude: [
                    /.+phaser-ce\/typescript\/.+\.ts$/,
                    /typescript\/.+\.d\.ts$/
                ]
            ,
            
              test: /\.html$/,
              loader: 'html-loader'
            ,

            // to-string-loader is for css loaded by angular components
            // .... and loading angular css work as expected.
             test: /\.css$/, loaders: ['to-string-loader', 'css-loader'] ,
            
              test: /\.scss$/, // I'd like so much sass work but guess what... it doesn't!
              use: ['to-string-loader', 'css-loader', 'sass-loader']
            ,

            // Because phaser and its dependencies are not made for TypeScript and webpack
             test: /pixi\.js/, use: [loader: 'expose-loader', options: 'PIXI'] ,
             test: /phaser-split\.js$/, use: [loader: 'expose-loader', options: 'Phaser'] ,
             test: /p2\.js/, use: [loader: 'expose-loader', options: 'p2'] 
        ]
    ,

    plugins: [
        new webpack.ContextReplacementPlugin(
            // The (\\|\/) piece accounts for path separators in *nix and Windows

            // For Angular 5, see also https://github.com/angular/angular/issues/20357#issuecomment-343683491
            /\@angular(\\|\/)core(\\|\/)esm5/,
            helpers.root('src'), // location of your src
            
              // your Angular Async Route paths relative to this root directory
            
          ),
        new CleanWebpackPlugin([distDir]),
        new HtmlWebpackPlugin(
            template: 'src/index.html',
            chunksSortMode: function(a, b) 
                // set the load order !
                var order = ["polyfills", "app"];
                return order.indexOf(a.names[0]) - order.indexOf(b.names[0]);
            
        )
    ]
;

这里是 webpack.prod.js 的配置:

module.exports = merge(common, 
    devtool: 'source-map',
    plugins: [
        // stops the build if there is an error
        new webpack.NoEmitOnErrorsPlugin(),
        new UglifyJSPlugin(sourceMap: true),
        // extracts embedded css as external files, adding cache-busting hash to the filename
        new ExtractTextPlugin('[name].[hash].css'),
        new webpack.DefinePlugin(
            'process.env.NODE_ENV': JSON.stringify('production')
        )
    ]
);

当我运行webpack --config config/webpack.prod.js 时,全局 CSS 未加载,没有错误。只是没有 CSS。

请随意解释如何加载 SCSS,因为它在我的开发模式下也不起作用。

谢谢!

【问题讨论】:

【参考方案1】:

我终于让它工作了。所以这是我所做的更改:

1) 现在在 css/scss 子句中忽略 style.css 的路径。


  exclude: path.resolve(__dirname, '../src/styles'),
  test: /\.css$/, loaders: ['to-string-loader', 'css-loader']
,

  exclude: path.resolve(__dirname, '../src/styles'),
  test: /\.scss$/,
  use: ['to-string-loader', 'css-loader', 'sass-loader']

2) 我为 CSS 添加了一个新的入口文件

entry: 
  'polyfills': './src/polyfills.ts',
  'app': './src/main.ts',
  'css': './src/styles/main.css'

3) 之所以有效,是因为我还配置了一个使用 ExtractTextPlugin 的新规则


  test: /\.css$/,
  exclude: path.resolve(__dirname, '../src/app'),
  use: ExtractTextPlugin.extract(
    fallback: 'style-loader',
    use: 'css-loader'
  )

请注意,这也有效,因为 prod 配置将 new ExtractTextPlugin('[name].[hash].css') 指定为插件。 (意思是需要在通用配置中添加,以免开发环境出错)

【讨论】:

【参考方案2】:

我认为您需要使用angular-cli,您可以在 angular-cli.JSON 中设置自定义 css url,如下所示:

"styles": [
        "../node_modules/bootstrap/dist/css/bootstrap.min.css",
        "../node_modules/font-awesome/css/font-awesome.min.css"

      ],

【讨论】:

如果我使用 Angular cli,我会严重依赖 Angular 工具。正如我在帖子中注意到的那样,我还使用移相器(以及 pixi 和 p2)。 Angular cli 不支持哪个(因为它们是奇怪的/老派的依赖,甚至在打字稿中也没有)。【参考方案3】:

更多的全局样式可以在.angular-cli.json中设置,大概是这样的:

...
"apps": [
    
      ...

      "styles": [
          "app/core/preloader/preloader.scss",
          "styles.scss"
      ],
      ...
    
]
...

app部分,你应该会发现这里可以设置更多的全局资产/脚本。

更多关于 .angluar-cli.json 的信息是here

【讨论】:

angular cli 因特殊依赖(移相器)而脱离主题***.com/questions/49512760/…

以上是关于如何使用 webpack、typescript、phaser 和 angular 配置全局 css 和 sass 样式表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用编译器包含的构建(Vue、Typescript、Webpack)

如何防止 jquery 使用 webpack 和 typescript 导入两次?

如何使用 webpack、typescript、phaser 和 angular 配置全局 css 和 sass 样式表

使用 npm 构建 webpack-typescript 库以用于其他 webpack-typescript 项目

如何使用 Typescript、React 和 Webpack 导入 SCSS 或 CSS 模块

如何将 CSS 模块与 Typescript、React 和 Webpack 一起使用?