npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

webpack-config-creator

v1.1.2

Published

My tool for fast creating a webpack developing environment easily, and also for memorizing.

Downloads

29

Readme

webpack-config-creator

My tool for fast creating a webpack developing environment easily, and also for memorizing.

It is recommended to install cross-env together to pass NODE_ENV in your command line.

Install

npm install webpack-config-creator --dev
// or
yarn add webpack-config-creator -D

Usage

In your webpack config file like webpack.config.js

const getConfig = require('webpack-config-creator');

// define env variable
process.env.CDN = '/cdn/assets/';

const config = getConfig({
  mode: process.env.NODE_ENV,
  rules: ['babel', 'vue', 'vue-scss', 'file-url', 'eslint'],
  devServer: true,
  defineEnv: ['CDN'],
  defineSass: {
    injectEnv: true,
    data: '@import "./src/variable.scss";',
  },
  template: true,
  extend(config) {
    // get created config to customize
    // the structure is same to webpack configs
  }
});

module.exports = config;

above will use an default base config as following:

you can easily overwrite these by using extend option

const config = {
  entry: resolve('./src/main.js'),
  output: {
    path: resolve('./dist'),
    publicPath: '/'
  },
  optimization: {
    splitChunks: { chunks: 'all' },
  },
  resolve: {
    extensions: ['.mjs', '.js', '.vue', '.json', '.scss', '.svelte'],
    alias: {
      '@': resolve('./src'),
    }
  }
};

Settings

mode

just the webpack config mode

rules

  • type: Array(String[, String])
  • allowed rules: babel, css, scss, vue-scss, eslint, vue, url, file-url, svelte

babel

This will inject default babel loaders with following settings, you can also overwrite it by your .babelrc...etc.

  • default dependencies: babel-loader @babel/core @babel/preset-env @babel/runtime @babel/plugin-syntax-dynamic-import @babel/plugin-transform-runtime

resolve get path from your root folder of project

module.exporst = {
  test: /\.js$/,
  loader: 'babel-loader',
  exclude: /(node_modules|bower_components)/,
  include: [resolve('./src')],
  options: {
    presets: [
      [
        '@babel/preset-env',
        { modules: false }
      ]
    ],
    comments: false,
    plugins: [
      '@babel/plugin-syntax-dynamic-import',
      '@babel/plugin-transform-runtime'
    ]
  }
};

css

since the postcss-loader is used by default if you use the css related rules, there should be a browserslists in your package.json.

  • default dependencies: style-loader css-loader mini-css-extract-plugin postcss-loader autoprefixer
{
  // ...
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const isProd = process.env.NODE_ENV === 'production';

const styleLoader = {
  loader: 'style-loader',
  options: {}
};

const cssLoader = {
  loader: 'css-loader',
  options: {
    sourceMap: true,
    esModule: false
  }
};

const postcssLoader = {
  loader: 'postcss-loader',
  options: {
    postcssOptions: {
      plugins: [
        'autoprefixer'
      ]
    },
  }
};

module.exports = {
  test: /\.css$/i,
  use: [
    isProd ? MiniCssExtractPlugin.loader : styleLoader,
    cssLoader,
    postcssLoader,
  ],
};

scss

Almost same as above css

  • default dependencies: css deps + sass sass-loader
//...

const sassLoader = {
  loader: 'sass-loader',
  options: {
    sourceMap: true,
  },
};

module.exports = {
  test: /\.s?css$/i,
  use: [
    isProd ? MiniCssExtractPlugin.loader : styleLoader,
    cssLoader,
    postcssLoader,
    sassLoader,
  ],
};

eslint

should include the eslint config in package.json before using this.

And since the eslint-plugin-vue has two version, please manually install it into your node_modules rely on your usage version of vue.

please refer: eslint-plugin-vue

  • default dependencies: eslint eslint-loader babel-eslint
// default eslint loader setting
module.exports = {
  test: /\.(js|vue)$/,
  loader: 'eslint-loader',
  enforce: 'pre',
  include: [resolve('./src')],
  options: { emitWarnings: true },
};
{
  "eslintConfig": {
    "extends": [
      // use eslint:recommended
      "webpack-config-creator/eslint"
      // for vue
      "webpack-config-creator/eslint/vue2"
      // for vue-next
      "webpack-config-creator/eslint/vue3"
    ]
  },
}

url

  • default dependencies: url-loader
module.exports = {
  test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  loader: 'url-loader',
  options: {
    limit: 1000,
    name: '[name].[ext]',
    outputPath: 'img',
    esModule: false,
  },
};

file-url

same as url, add fallback to file-loader

  • default dependencies: url-loader file-loader
module.exports = {
  // ...same to url
  options: {
    // ...same to url
    fallback: require.resolve('file-loader'),
  },
};

vue-scss

just replace the style-loader to vue-style-loader, and will auto add VueLoaderPlugin into the config's plugins. If you are using vue3.x, please install the beta version of vue-loader [email protected]

  • default dependencies: above sass deps + vue-loader

vue

vue & vue-loader & compiler has to be installed by yourself, no matter vue2, vue3,the setting is the same, just install the version, will auto handle the compiler for it.

be aware that vue2 use the compiler named vue-template-compiler, which vue3 is @vue/compiler-sfc, do not install them together into your deps.

module.exports = {
  test: /\.vue$/,
  use: 'vue-loader'
};

svelte

const autoPreprocess = require('svelte-preprocess');

module.exports = {
  test: /\.svelte$/,
  exclude: /node_modules/,
  loader: 'svelte-loader',
  options: {
    preprocess: autoPreprocess({})
  }
};

devServer

use default devServer settings as following:

  • type: Boolean || Object
  • default dependencies: webpack-dev-server
module.exports = {
  host: '0.0.0.0',
  disableHostCheck: true,
  inline: true,
  hot: true,
  historyApiFallback: true,
  overlay: { errors: true },
};

if an object is provided, will use Object.assign to merge with default settings.

defineEnv

env variables should be defined into webpack, use definePlugin.

  • type: Array(String[, String])

you should define the env variables before geting the config, just as demo shows

defineSass

define sass prepend datas

  • type: Object({ injectEnv, data })
    • injectEnv
      • type: Boolean
      • what: whether auto inject all env variables into sass variables before data
    • data
      • type: String
      • what: scss text to be prepend
module.exports = {
  defineSass: {
    injectEnv: true, // this will auto inject all the env variable into "data"
    data: '$node-env: ' + process.env.NODE_ENV + ';', // additionalData for sass options
  }
};

template

whether use html-webpack-plugin with default settings

  • type: Boolean
module.exports = {
  template: resolve('./index.html'),
  filename: 'index.html',
  inject: true,
  minify: isProd
    ? {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true,
      }
    : false,
};

extend

customize your webpack config with this, you can provide both Object or Function to adjust the default webpack config

Object will be auto merged with webpack-merge.

Function will not, so remember to return the config after adjusting.

// as Object
const myConfig = getConfig({
  //...
  extend: {
    devServer: {
      port: 3000,
    }
  }
})

// as Function
const myConfig = getConfig({
  //...
  extend(config) {
    config.module.rules.push(myNewRule);
    return config;
  }
})

License

MIT

Copyright (c) 2020-present, Johnny Wang