【问题标题】:Symfony 4 - Webpack Encore bootstrap css not in outputSymfony 4 - Webpack Encore 引导 css 不在输出中
【发布时间】:2019-03-03 06:15:27
【问题描述】:

我正在尝试将 Webpack Encore 引入我的 Symfony 4 应用程序以管理 JS 和 CSS 资产。

我安装了yarnnodejs

然后是composer require encore,然后是yarn install

我在assets/js/ 中有app.js 文件。

/*
 * Welcome to your app's main JavaScript file!
 *
 * We recommend including the built version of this JavaScript file
 * (and its CSS file) in your base layout (base.html.twig).
 */

// any CSS you require will output into a single css file (app.css in this case)
require('bootstrap');
require('../css/app.css');

// Need jQuery? Install it with "yarn add jquery", then uncomment to require it.
const $ = require('jquery');

console.log('Hello Webpack Encore! Edit me in assets/js/app.js');

使用 yarn 安装 bootstrap 和其他依赖项:

{
    "devDependencies": {
        "@symfony/webpack-encore": "^0.22.0",
        "bootstrap": "^4.3.1",
        "jquery": "^3.3.1",
        "popper.js": "^1.14.7",
        "webpack-notifier": "^1.6.0"
    },
    "license": "UNLICENSED",
    "private": true,
    "scripts": {
        "dev-server": "encore dev-server",
        "dev": "encore dev",
        "watch": "encore dev --watch",
        "build": "encore production --progress"
    }
}

然后运行yarn encore dev --watch

问题

我的public/build/app.css 中没有任何引导 css。

除了webpack.config.js 中的require('bootstrap');,我还需要什么吗?

【问题讨论】:

    标签: symfony webpack yarnpkg webpack-4 webpack-encore


    【解决方案1】:

    如果您转到node_modules 目录,查找bootstrap 并打开它的package.json,您会找到该条目:

    "main": "dist/js/bootstrap",
    

    当你这样做时:

    require("bootstrap");
    

    在您的文件中,您需要库的package.jsonmain 部分中指定的文件。
    但是,您可以通过指定其(相对)路径来要求库中的任何文件:

    require("bootstrap/dist/css/bootstrap.css");
    

    现在你可以运行了:

    yarn encore dev
    

    Bootstrap CSS 应该在您的app.css 中。

    编辑(2019-03-05):
    这是截屏视频的relevant block code7。需要 CSS!?,SymfonyCasts 课程的一部分Webpack Encore: A Party for your Assets Tutorial

    更新(2019-11-25):
    此答案解释了如何使用Node.js 提供的require 函数绑定(导入)使用yarn(或npm)安装的CSS 库。

    ECMAScript 2015(也称为 ES6)引入了新功能 import。它的用法在来自WhiteRabbitanswer 中进行了解释。

    除了这两个选项之外,还有第三种方法可以导入 Bootstrap,即在您自己的 CSS 文件中直接使用 @import

    @import 'bootstrap';
    

    这仅适用于使用 WebpackYarn(或 NPM)。 Webpack Encore 能够解析路径并导入对应的 CSS 文件。

    【讨论】:

      【解决方案2】:

      根据文档bootstrap in webpack encore

      在 webpack.config.js 中可以有

      var Encore = require('@symfony/webpack-encore');
      
      Encore
          // directory where compiled assets will be stored
          .setOutputPath('public/build/')
          // public path used by the web server to access the output path
          .setPublicPath('/build')
          // only needed for CDN's or sub-directory deploy
          //.setManifestKeyPrefix('build/')
      
          /*
           * ENTRY CONFIG
           *
           * Add 1 entry for each "page" of your app
           * (including one that's included on every page - e.g. "app")
           *
           * Each entry will result in one JavaScript file (e.g. app.js)
           * and one CSS file (e.g. app.css) if you JavaScript imports CSS.
           */
          .addEntry('app', './assets/js/app.js')
      
          .splitEntryChunks()
          // will require an extra script tag for runtime.js
          // but, you probably want this, unless you're building a single-page app
          .enableSingleRuntimeChunk()
      
          /*
           * FEATURE CONFIG
           *
           * Enable & configure other features below. For a full
           * list of features, see:
           * https://symfony.com/doc/current/frontend.html#adding-more-features
           */
          .cleanupOutputBeforeBuild()
          .enableBuildNotifications()
          .enableSourceMaps(!Encore.isProduction())
          // enables hashed filenames (e.g. app.abc123.css)
          .enableVersioning(Encore.isProduction())
      
          // enables Sass/SCSS support
          // .enableSassLoader()
      
          // uncomment if you use TypeScript
          //.enableTypeScriptLoader()
      
          // uncomment if you're having problems with a jQuery plugin
          .autoProvidejQuery()
      
          // uncomment if you use API Platform Admin (composer req api-admin)
          //.enableReactPreset()
          //.addEntry('admin', './assets/js/admin.js')
      ;
      
      module.exports = Encore.getWebpackConfig();
      

      然后使用以下命令安装 jquery、popper.js、bootstrap、font-awesome(如果您使用的是 npm 并且需要 font-awesome):

      npm install jquery --save-dev
      npm install popper.js --save-dev
      npm install bootstrap@4 --save-dev
      npm install font-awesome --save-dev
      

      在 app.js 中,你可以有:

      /*
       * Welcome to your app's main JavaScript file!
       *
       * We recommend including the built version of this JavaScript file
       * (and its CSS file) in your base layout (base.html.twig).
       */
      
      // any CSS you require will output into a single css file (app.css in this case)
      require('../css/app.css');
      
      // Need jQuery? Install it with "yarn add jquery", then uncomment to require it.
      const $ = require('jquery');
      import 'popper.js';
      import 'bootstrap';
      import 'bootstrap/dist/css/bootstrap.css';
      import 'font-awesome/css/font-awesome.css';
      
      $(document).ready(function(){
          // Put your jquery code here.
      });
      

      在您的模板中,您可以:

      <!DOCTYPE html>
      <html>
          <head>
              <meta charset="UTF-8">
              <title>title</title>
              {{ encore_entry_link_tags('app') }}  
          </head>
          <body>
               <div id="content_container"></div>
      
               {% block lib_javascripts %}
                    {{ encore_entry_script_tags('app') }}
               {% endblock %}
               {% block javascripts %}{% endblock %}
          </body>
      </html>                
      

      您可以构建和观看。在您的项目目录中,您可以执行以下操作:

      ./node_modules/.bin/encore dev --watch
      

      【讨论】:

      • 这个答案并不完美,因为它需要安装 symfony/webpack-encore-bundle 而不是默认的
      【解决方案3】:

      基本上是 cezar 所说的,但我将其放在答案中,因为评论会使它难以阅读:

      import 'bootstrap';  // js-file
      import 'bootstrap/dist/css/bootstrap.css'; // css file
      

      不是 100% 确定,但我认为您还需要手动导入 Popper 和 Jquery:

      import Popper from 'popper.js';
      import $ from 'jquery';
      

      【讨论】:

      • 是的,这是一个有效的答案,而不仅仅是评论。它是获取 CSS 文件的替代方法。在 CSS 中,从那时起就可以导入其他文件(至少自从我知道 CSS 以来)。在使用 Webpack 和 Yarn 时,我认为 require all modules 会更好。
      • 这个答案解释了 ES6 (MDN web docs) 中实现的 import 功能。在我之前的评论中,我提到了@import (MDN web docs)。对于造成的混乱,我深表歉意。
      猜你喜欢
      • 2020-05-23
      • 2019-03-04
      • 2020-01-29
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多