如何通过 Webpack 打包 Nunjucks 文件

How to bundle Nunjucks files via Webpack

我有一个完整的网站,我想为 it.In 设计一个构建工具,事实上,我选择了 Webpack 来做这件事。项目结构是这样的:

我有 nunjucks、html、css、sass 和 js 文件。我必须通过 webpack 捆绑它们。我的 webpack 配置文件在这里:

var HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const path = require('path')
const CopyPlugin = require('copy-webpack-plugin')
const NunjucksWebpackPlugin = require('nunjucks-webpack-plugin')

module.exports = {
    entry: ['./src/index.js'],
    output: {
       filename: 'bundle.js',
       path: path.resolve(__dirname, 'dist')
        },
    devtool: 'inline-source-map',
    devServer: {
        contentBase: './dist',
        writeToDisk: true
    },
   plugins: [
       new CopyPlugin([
           { from: 'public/images', to: 'images' },
           { from: 'public/fonts', to: 'fonts' },
           { from: 'src/pages/about', to: '.' }
         ]),
         new CleanWebpackPlugin(),
       // new HtmlWebpackPlugin()
        new HtmlWebpackPlugin({
           title: 'Asset Management' //title of file.html
         })
       ],
     module: {
        rules: [
           {
               test: /\.css$/,
               use: ['style-loader', 'css-loader']
            },
            {
               test: /\.s[ac]ss$/i,
               use: [
                // Creates `style` nodes from JS strings
                'style-loader',
                // Translates CSS into CommonJS
                'css-loader',
                // Compiles Sass to CSS
                'sass-loader'
            ]
          },
          {
            test: /\.(png|svg|jpg|gif)$/,
            use: ['file-loader']
          },
          {
            test: /\.(woff|woff2|eot|ttf|otf)$/,
            use: ['file-loader']
          },
          {
            test: /\.(njk|nunjucks)$/,
            loader: 'nunjucks-loader'
          },
         {
             // to auto refresh index.html and other html
             test: /\.html$/,
             loader: 'raw-loader',
             exclude: /node_modules/
         },
        {
            test: /\.html$/,
            use: [
                {
                    loader: 'html-loader',
                    options: {
                        interpolate: true
                    }
                }
            ]
        }
     ]
   }
  }

"index.js"文件也是这样:

  import _ from 'lodash'
  import './pages/about/about_moon.scss'
  import './pages/about/about_moon.html'
  var tpl = require('./pages/home/index_moon.njk')
  var html = tpl.render({ message: 'Foo that!' })
  function component() {
  return element
    }
   document.body.appendChild(component())

我配置了 "package.json" 文件并将脚本定义为 运行 webpack:

    "start": "webpack-dev-server --open",
    "build": "webpack"

问题是当我 运行 npm run build 时,创建了 dist 文件夹,它有一个 html 文件,但没有任何显示。我已经有一些 html 文件并想将它们全部捆绑到 "bundle.js",但我不知道如何。你能告诉我如何捆绑这个项目吗?

提前致谢。

问题已解决。我将 Webpack.config.js 文件更改为:

  const path = require('path')
  var HtmlWebpackPlugin = require('html-webpack-plugin')
  var UglifyJSPlugin = require('uglifyjs-webpack-plugin')
  const CopyPlugin = require('copy-webpack-plugin')
  const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  const BrowserSyncPlugin = require('browser-sync-webpack-plugin')
  module.exports = {
       entry: ['./src/index.js', './script.js'],
       output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
      },
    plugins: [
    // HtmlWebpackPluginConfig
      new HtmlWebpackPlugin({
          filename: 'index.html',
           inject: 'head',
           template: './index.njk'
         }),
      new CleanWebpackPlugin(),
      new CopyPlugin([
        { from: 'public/images', to: 'images' },
        { from: 'public/fonts', to: 'fonts' }
      ])
     ],
    module: {
    rules: [
          {
            test: /\.exec\.js$/,
            use: ['script-loader']
          },
          {
            test: /\.css$/i,
            use: ['style-loader', 'css-loader']
          },
          {
            test: /\.(scss)$/,
            use: [
                {
                 // Adds CSS to the DOM by injecting a `<style>` tag
                    loader: 'style-loader'
                },
                {
                    // Interprets `@import` and `url()` like `import/require()` and will resolve them
                    loader: 'css-loader'
                },
                {
                    // Loader for webpack to process CSS with PostCSS
                    loader: 'postcss-loader',
                    options: {
                        plugins: function() {
                            return [require('autoprefixer')]
                        }
                    }
                },
                {
                    // Loads a SASS/SCSS file and compiles it to CSS
                    loader: 'sass-loader'
                }
              ]
            },
          {
            // HTML LOADER
            // Super important: We need to test for the html
            // as well as the nunjucks files
            test: /\.html$|njk|nunjucks/,
            use: [
                'html-loader',
                {
                    loader: 'nunjucks-html-loader',
                    options: {
                        // Other super important. This will be the base
                        // directory in which webpack is going to find
                        // the layout and any other file index.njk is calling.
                        //  searchPaths: [...returnEntries('./src/pages/**/')]
                        // Use the one below if you want to use a single path.
                        // searchPaths: ['./']
                    }
                }
            ]
        }
       ]
     }
    }

另外,script.js文件我是这样写的,因为函数名改了,绑定后不能运行

   document.getElementById('body').onload = function() {
   console.log('Document loaded')
   var menu = localStorage.getItem('menu')
   if (menu === 'opened') 
     document.getElementById('navigation').classList.add('opened')
   }
  document.getElementById('menu-button').onclick = function() {
  // localstorage used to define global variable
  var menu = localStorage.getItem('menu')
  localStorage.setItem('menu', menu === 'closed' ? 'opened' : 'closed')
  document.getElementById('navigation').classList.toggle('opened')
  }
  // Window.onLoad = onLoad // global variable in js

index.js用于导入其他文件,是这样的:

   import _ from 'lodash'
   require('../index.njk')
   require('../base.html')
   require('../style.css')

这是 Json 文件:

   {
   "name": "menu_moon",
   "version": "1.0.0",
   "description": "",
   "private": true,
   "dependencies": {
   "browser-sync": "^2.26.7",
   "extract-text-webpack-plugin": "^3.0.2",
   "fast-glob": "^3.1.1",
   "fs-extra": "^8.1.0",
   "g": "^2.0.1",
   "html-loader": "^0.5.5",
   "i": "^0.3.6",
   "lodash": "^4.17.15",
   "mkdirp": "^0.5.1",
   "nunjucks": "^3.2.0",
   "nunjucks-html-loader": "^1.1.0",
   "nunjucks-isomorphic-loader": "^2.0.2",
   "nunjucks-loader": "^3.0.0",
   "raw-loader": "^4.0.0"
},
   "devDependencies": {
      "browser-sync-webpack-plugin": "^2.2.2",
      "clean-webpack-plugin": "^3.0.0",
      "copy-webpack-plugin": "^5.0.5",
      "css-loader": "^3.2.1",
      "file-loader": "^5.0.2",
      "html-webpack-plugin": "^3.2.0",
      "node-sass": "^4.13.0",
      "nunjucks-webpack-plugin": "^5.0.0",
      "sass-loader": "^8.0.0",
      "script-loader": "^0.7.2",
      "style-loader": "^1.0.1",
      "uglifyjs-webpack-plugin": "^2.2.0",
      "webpack": "^4.41.2",
      "webpack-cli": "^3.3.10",
      "webpack-dev-server": "^3.9.0"
       },
    "scripts": {
      "moon-start": "browser-sync start --server --files './**/*.*'",
      "moon-build": "node build_product_moon.js",
      "start": "webpack-dev-server --open",
      "build": "webpack"
      },
    "author": "",
    "license": "ISC"
    }

希望对其他人有用。