Django Webpack загрузчик для стати c библиотек - PullRequest
0 голосов
/ 27 февраля 2020

У нас есть приложение django, и мы хотим собрать все наши библиотеки stati c javascript через npm и веб-пакет вместо загрузки их через cdn.

Это наш пакет. json для управления библиотеками и установки.

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "./node_modules/.bin/webpack --config webpack.config.js --mode production"
  },
  "author": "Florian Eichin",
  "devDependencies": {
    "@babel/core": "^7.8.4",
    "@babel/preset-env": "^7.8.4",
    "babel": "^6.23.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^8.0.6",
    "babel-preset-es2015": "^6.24.1",
    "bower": "^1.8.8",
    "css-loader": "^3.4.2",
    "file-loader": "^5.1.0",
    "style-loader": "^1.1.3",
    "webpack": "^4.41.6",
    "webpack-bundle-tracker": "^1.0.0-alpha.0",
    "webpack-cli": "^3.3.11"
  },
  "dependencies": {
    "bootstrap": "^3.3.7",
    "jquery": "^3.4.1",
    "jquery-form": "^4.2.2",
    "jquery-ui": "^1.12.1",
    "js-cookie": "^1.5.0",
    "popper.js": "^1.16.1",
    "select2": "^4.0.13",
  }
}

У нас есть индекс. js, куда мы импортируем все такие зависимости:

global.$ = require("jquery");
global.jQuery = require("jquery");

import('jquery/dist/jquery.min.js')
import('jquery-form/dist/jquery.form.min.js')
import('jquery-ui')
import('js-cookie/src/js.cookie.js')
import('select2/dist/js/select2.full.min.js')
import('select2/dist/js/i18n/de.js')

import('popper.js/dist/popper.min.js')
import('bootstrap/dist/js/bootstrap.min.js')

Все файлы затем собрал через веб-пакет. Конфигурация для этого выглядит следующим образом:

const webpack = require('webpack');
const path = require('path');
const BundleTracker = require('webpack-bundle-tracker');

module.exports = {
    entry: {index: './assets/js/index.js'},
    stats: {
        entrypoints: true
    },
    output: {
        path: path.resolve('./assets/bundles/'),
        publicPath: 'http://localhost:8000/static/bundles/',
        filename: '[name]-[hash].js',
        chunkFilename: "[name]-[hash].js"
    },
    plugins: [
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
        }),
        new BundleTracker({
            path: __dirname,
            filename: './webpack-stats.json'
        }),
    ],

    module: {
        rules: [
            {
                test: /\.js$/,
                use: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.css$/i,
                use: ['style-loader', 'css-loader'],
            }, {
                test: /\.(png|jpe?g|gif|svg|eot|woff|woff2|ttf)$/i,
                use: 'file-loader',
            },
        ]
    }
};

Чтобы загрузить все в django и статические файлы, мы используем webpackloader . Все работает, как и ожидалось, но я думаю, что javascript файлы загружаются асинхронно, и поэтому возникают случайные ошибки импорта. Часто возникают ошибки, такие как

foo не является функцией

и так далее. Но это появляется случайно. При каждой перезагрузке отсутствует еще одна Зависимость. Таким образом, есть несколько вопросов по этому вопросу.

  • Это хорошая идея, управлять такими библиотеками js?
  • Есть ли другие надежные решения?
  • Есть ли возможность загрузить js синхронно перед выполнением кода приложения?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...