GithubHelp home page GithubHelp logo

webpack-contrib / extract-text-webpack-plugin Goto Github PK

View Code? Open in Web Editor NEW
4.0K 100.0 518.0 779 KB

[DEPRECATED] Please use https://github.com/webpack-contrib/mini-css-extract-plugin Extracts text from a bundle into a separate file

License: MIT License

JavaScript 95.03% CSS 4.07% HTML 0.91%
webpack-plugin

extract-text-webpack-plugin's Introduction

DEPRECATED

Please use: https://github.com/webpack-contrib/mini-css-extract-plugin

If you have problem(s) with migration on MiniCssExtractPlugin feel free to open issue with reproducible test repo, thanks


npm node deps tests coverage chat

Extract Text Plugin

Extract text from a bundle, or bundles, into a separate file.

Install

# for webpack 3
npm install --save-dev extract-text-webpack-plugin
# for webpack 2
npm install --save-dev [email protected]
# for webpack 1
npm install --save-dev [email protected]

Usage

⚠️ Since webpack v4 the extract-text-webpack-plugin should not be used for css. Use mini-css-extract-plugin instead.

⚠️ For webpack v1, see the README in the webpack-1 branch.

const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: "css-loader"
        })
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin("styles.css"),
  ]
}

It moves all the required *.css modules in entry chunks into a separate CSS file. So your styles are no longer inlined into the JS bundle, but in a separate CSS file (styles.css). If your total stylesheet volume is big, it will be faster because the CSS bundle is loaded in parallel to the JS bundle.

Advantages Caveats
Fewer style tags (older IE has a limit) Additional HTTP request
CSS SourceMap (with devtool: "source-map" and extract-text-webpack-plugin?sourceMap) Longer compilation time
CSS requested in parallel No runtime public path modification
CSS cached separate No Hot Module Replacement
Faster runtime (less code and DOM operations) ...

Options

new ExtractTextPlugin(options: filename | object)
Name Type Description
id {String} Unique ident for this plugin instance. (For advanced usage only, by default automatically generated)
filename {String|Function} Name of the result file. May contain [name], [id] and [contenthash]
allChunks {Boolean} Extract from all additional chunks too (by default it extracts only from the initial chunk(s))
When using CommonsChunkPlugin and there are extracted chunks (from ExtractTextPlugin.extract) in the commons chunk, allChunks must be set to true
disable {Boolean} Disables the plugin
ignoreOrder {Boolean} Disables order check (useful for CSS Modules!), false by default
  • [name] name of the chunk
  • [id] number of the chunk
  • [contenthash] hash of the content of the extracted file
  • [<hashType>:contenthash:<digestType>:<length>] optionally you can configure
    • other hashTypes, e.g. sha1, md5, sha256, sha512
    • other digestTypes, e.g. hex, base26, base32, base36, base49, base52, base58, base62, base64
    • and length, the length of the hash in chars

⚠️ ExtractTextPlugin generates a file per entry, so you must use [name], [id] or [contenthash] when using multiple entries.

#extract

ExtractTextPlugin.extract(options: loader | object)

Creates an extracting loader from an existing loader. Supports loaders of type { loader: [name]-loader -> {String}, options: {} -> {Object} }.

Name Type Description
options.use {String}/{Array}/{Object} Loader(s) that should be used for converting the resource to a CSS exporting module (required)
options.fallback {String}/{Array}/{Object} loader(e.g 'style-loader') that should be used when the CSS is not extracted (i.e. in an additional chunk when allChunks: false)
options.publicPath {String} Override the publicPath setting for this loader

Multiple Instances

There is also an extract function on the instance. You should use this if you have more than one instance of ExtractTextPlugin.

const ExtractTextPlugin = require('extract-text-webpack-plugin');

// Create multiple instances
const extractCSS = new ExtractTextPlugin('stylesheets/[name]-one.css');
const extractLESS = new ExtractTextPlugin('stylesheets/[name]-two.css');

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: extractCSS.extract([ 'css-loader', 'postcss-loader' ])
      },
      {
        test: /\.less$/i,
        use: extractLESS.extract([ 'css-loader', 'less-loader' ])
      },
    ]
  },
  plugins: [
    extractCSS,
    extractLESS
  ]
};

Extracting Sass or LESS

The configuration is the same, switch out sass-loader for less-loader when necessary.

const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'sass-loader']
        })
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('style.css')
    //if you want to pass in options, you can do so:
    //new ExtractTextPlugin({
    //  filename: 'style.css'
    //})
  ]
}

url() Resolving

If you are finding that urls are not resolving properly when you run webpack. You can expand your loader functionality with options. The url: false property allows your paths resolved without any changes.

const ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: [
            {
                loader: 'css-loader',
                options: {
                    // If you are having trouble with urls not resolving add this setting.
                    // See https://github.com/webpack-contrib/css-loader#url
                    url: false,
                    minimize: true,
                    sourceMap: true
                }
            }, 
            {
                loader: 'sass-loader',
                options: {
                    sourceMap: true
                }
            }
          ]
        })
      }
    ]
  }
}

Modify filename

filename parameter could be Function. It passes getPath to process the format like css/[name].css and returns the real file name, css/js/a.css. You can replace css/js with css then you will get the new path css/a.css.

entry: {
  'js/a': "./a"
},
plugins: [
  new ExtractTextPlugin({
    filename:  (getPath) => {
      return getPath('css/[name].css').replace('css/js', 'css');
    },
    allChunks: true
  })
]

Maintainers


Juho Vepsäläinen

Joshua Wiens

Kees Kluskens

Sean Larkin

extract-text-webpack-plugin's People

Contributors

ai avatar akihikodaki avatar andreypopp avatar bcbcb avatar bebraw avatar billgo avatar briandipalma avatar chentsulin avatar ctrlzvi avatar daltones avatar daniel15 avatar diurnalist avatar eugenehlushko avatar evilebottnawi avatar georgetaveras1231 avatar gl2748 avatar insin avatar izaakschroeder avatar jameslnewell avatar joshwiens avatar jpeer264 avatar lcxfs1991 avatar michael-ciniawsky avatar pgilad avatar ratson avatar scottdj92 avatar skipjack avatar sokra avatar texastoland avatar wtgtybhertgeghgtwtg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

extract-text-webpack-plugin's Issues

Version 0.1.1 throws fatal error

I'm using the same setup as the example does and it always throws the error:

Fatal error: Cannot read property '[...]/node_modules/extract-text-webpack-plugin' of undefined

After downgrading to v0.1.0 it worked again.

Style loader useable with extract-text-webpack-plugin

Can I use style-loader's useable feature with extract-text-webpack-plugins?

This doesn't work:

// Excerpt from webpack.config.js
module: {
        loaders: [
            { test: /\.css$/, loader: ExtractTextPlugin.extract(
                'style-loader/useable',
                'css-loader?sourceMap'
            ) }
    },
    plugins: [
        new ExtractTextPlugin('[name].css?[hash]-[chunkhash]-[name]', {
            disable: false,
            allChunks: true
        })
    ]
}

Fails at my first use of style.use().

Stuck up on ‘loader is used without the corresponding plugin’

Webpack cannot compile the bundle.

config:

var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    entry: __dirname + '/src/js/main.jsx',
    output: {
        path: __dirname + "/dist/js",
        filename: 'bundle.js'
    },
    module: {
        loaders: [
            { test: /\.jsx?$/, loader: 'jsx-loader?harmony' },
            { test: /\.scss$/, loader: ExtractTextPlugin.extract( 'style-loader', 'css-loader!sass-loader' ) },
        ],
        plugins: [
            new ExtractTextPlugin( "bundle.css" )
        ]
    }
};

main/jsx

...
require( "../style/main.scss" );
...

Loaders are installed. It works fine when I just inline styles in bundle.
What did I do wrong?

using @import with a url results in incomplete CSS

I have a very simple arrangement of stylesheets

style.css

@import url(http://fonts.googleapis.com/css?family=Roboto+Slab:700,400);
h1 {
  font-family: 'Roboto Slab', serif;
}

The resulting CSS file will only include

@import url(http://fonts.googleapis.com/css?family=Roboto+Slab:700,400);

To fix the issue temporarily, I made the following changes

  1. remove the @import url(...); from the CSS
  2. add a <link> in my index.html file
  3. rerun webpack; it will now output the proper CSS files

For clarification, here's a snippet of index.html

<link href="http://fonts.googleapis.com/css?family=Roboto+Slab:700,400" rel="stylesheet" type="text/css">
<link href="app.css" rel="stylesheet" type="text/css">

My webpack.config.js

var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");

var release = (process.env.NODE_ENV === 'production');

var plugins = [
  new ExtractTextPlugin("[name].css")
];

if (release)  {
  plugins.push(new webpack.DefinePlugin({
    "process.env": {
      "NODE_ENV": JSON.stringify("production"),
    },
  }));
  plugins.push(new webpack.optimize.UglifyJsPlugin());
}

module.exports = {
  debug: !release,
  cache: !release,
  devtool: !release && "inline-source-map",
  entry: {
    "app": "./client/main",
  },
  output: {
    path: __dirname + "/public",
    filename: "[name].js",
  },
  plugins: plugins,
  resolve: {
    modulesDirectories: ["node_modules", "bower_components"]
  },
  module: {
    loaders: [
      {test: /\.less$/, loader: ExtractTextPlugin.extract("style", "css!autoprefixer!less")},
      {test: /\.png$/,  loader: "url?limit=10000&mimetype=image/png" },
      {test: /\.woff$/, loader: "url?limit=10000&mimetype=application/font-woff" },
      {test: /\.ttf$/,  loader: "url?limit=10000&mimetype=application/octet-stream" },
      {test: /\.eot$/,  loader: "file" },
      {test: /\.svg$/,  loader: "url?limit=10000&mimetype=image/svg+xml" }
    ],
  },
};

Styles not extracted from common chunk

I'm using CommonsChunkPlugin together with extract text plugin. I set extract options to be allChunks = true, but it doesn't seems to extract css from the common chunk generated by CommonChunkPlugin. Inside common.bundle.js there is still embedded css.

Is is possible to make extract- text-plugin extract css across all chunks into one css file?

The set-up looks as follows:

var externalLibs = ['jquery', ...];
...
entry: {
            entryOne: 'entryOne.js',
            entryTwo: 'entryTwo.js',
            common: externalLibs
        },
module: {
   loader: [
      { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader?root=' + appRoot) },
   }
}
plugins: [
   new ExtractTextPlugin("styles/default.css", {
      allChunks: true
   }),
   new webpack.optimize.CommonsChunkPlugin("common", "common.bundle.js")
]

entryOne.js and entryTwo.js both require in the same file (say shared.js), which in turn requires in a css file. CommonsChunkPlugin puts shared.js into common.bundle.js, which is fine, but it also carries the css content along with it, it seems.

Causes errors when running UglifyJSPlugin

Looks like the CSS is getting handed to plugins like Uglify.

Test case

Hash: 8810dc45af0f3d654180
Version: webpack 1.4.0-beta4
Time: 484ms
     Asset  Size  Chunks             Chunk Names
   home.js   942       0  [emitted]  home
1.chunk.js   165       1  [emitted]
  home.css    18       0  [emitted]  home
chunk    {0} home.js, home.css (home) 485 [rendered]
chunk    {1} 1.chunk.js 305 {0} [rendered]

WARNING in home.js from UglifyJs
Dropping unused function argument require [./web_modules/home/index.js:3,0]

ERROR in home.css from UglifyJs
Unexpected token: punc (.) [home.css:1,0]
Child extract-text-webpack-plugin:
    chunk    {0} /[...]/webpack-bugs/extract-text-plugin-bug-uglify/node_modules/extract-text-webpack-plugin /[...]/webpack-bugs/extract-text-plugin-bug-uglify/node_modules/css-loader/index.js!/[...]/webpack-bugs/extract-text-plugin-bug-uglify/web_modules/home/index.css 565 [rendered]

Bug in 0.4.0

After updating to 0.4, css is extracted in wrong order. You can check my configuration at https://github.com/steida/este

@import '../../node_modules/normalize.css/normalize.css'
@import './button.styl'

*
  -webkit-tap-highlight-color rgba(0,0,0,0)

This should be extracted in the order: normalize, then button, then the rest of the file.
Instead button is first, the file content, and normalize is last. It looks like a bug.

css-loader can't find modules when used with ExtractTextPlugin

I'm using ExtractTextPlugin to generate a single file with all of my CSS rules in it, rather than having them inserted at runtime (into mulitple style elements). If I include a url then the css-loader is unable to find the referenced resource, regardless of where I put it, for example

Symbols.css:

@font-face {
    font-family: "FontAwesome";
    src: url(fontawesome-webfont.woff);
}

webpack.config.js:

var ExtractTextPlugin = require('extract-text-webpack-plugin');

module.exports = {
    cache: false,
    entry: './src/news.jsx',
    output: {
        path: __dirname,
        filename: 'news.js'
    },
    module: {
        loaders: [
            { test: /\.css$/, loaders: [ExtractTextPlugin.loader, "css-loader"] },
            { test: /\.jsx$/, loader: "jsx-loader" },
            { test: /\.woff$/, loader: "file-loader" },
            { test: /\.json$/, loader: "json-loader" },
        ]
    },
    plugins: [
        new ExtractTextPlugin("styles.css")
    ],
    resolve: {
        modulesDirectories: ['.', '../reflex', '../../node_modules']
    }
};

Running Webpack:

ERROR in ../reflex/Style/Symbols.css
Module build failed: Error: Cannot find module './fontawesome-webfont.woff'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/home/ralpht/meta/merlin/node_modules/extract-text-webpack-plugin/loader.js!/home/ralpht/meta/merlin/node_modules/css-loader/index.js!/home/ralpht/meta/merlin/experimental/reflex/Style/Symbols.css:2:118)
    at Module._compile (module.js:456:26)
    at Object.loaderContext.exec (/home/ralpht/meta/merlin/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:86:7)
    at Object.module.exports (/home/ralpht/meta/merlin/node_modules/extract-text-webpack-plugin/loader.js:7:18)
 @ ./src/news.jsx 23:18-46

Ideally I'd like to either have webpack leave the woff file where it is and update the url reference, or copy it and update the url reference (which is what css-loader does by default, I think).

notExtractLoader not working

I can't get this working using the example provided (once you install webpack locally) because the style loader is not included in the build:

Uncaught TypeError: Cannot read property 'call' of undefined

Adding { test: /\.css$/, loader: 'style-loader' } to the config would fix the build (by including the style-loader module) if there were no urls in the CSS…but there are, so the build is still broken because the bundle contains a require to the png module which is not included in the build

Test case

Unexpected: "ERROR in <blah> doesn't export content"

When running ./node_modules/webpack/bin/webpack.js --watch, an error shows up in the terminal after changing a CSS file ("ERROR in doesn't export content"), and the webpack compilation seems to run twice.

The high-level setup is as follows: two entry points, one (OneEntry.js) does a synchronous require of Dep.js, and the other (TwoEntry.js) does a require.ensure of Dep.js. Dep.js requires Dep.css. Changing Dep.css while running with --watch triggers the error message.

The final output doesn't seem to be affected (at least in my simple example here), but it's still a scary message. I started to step through it with node-debug, but didn't get much farther than figuring out where the error was coming from -- line 156 of extract-text-webpack-plugin/index.js. I'll probably look at it at little further tomorrow.

My webpack.config.js:

var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
    target: "web",
    debug: true,
    // devtool: "source-map",
    entry: {
        One: './OneEntry.js',
        Two: './TwoEntry.js'
    },
    output: {
        path: "./target",
        filename: "[name].bundle.js"
    },
    module: {
        loaders: [            
            { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") },
        ]
    },
    plugins: [
        new ExtractTextPlugin("[name].styles.css")
    ]
};

OneEntry.js

require('./Dep.js');

module.exports = function () {
    console.log("OneEntry");
}

TwoEntry.js

module.exports = function () {
    require.ensure([], function (require) {
        var One = require('./Dep.js');
    });
}

Dep.js

require('./Dep.css');

module.exports = function helloWorld() {
    console.log("Hello, World!");
}

Dep.css

body {
    font-weight: normal;
}

Console output:

[10:30:58] extract-text-plugin-bug-repro$ ./node_modules/webpack/bin/webpack.js --watch
Hash: 1af67a17d8cdba702d4f
Version: webpack 1.4.13
Time: 123ms
         Asset  Size  Chunks             Chunk Names
 Two.bundle.js  3850       0  [emitted]  Two
 1.1.bundle.js   332       1  [emitted]
 One.bundle.js  1886    2, 1  [emitted]  One
One.styles.css    32    2, 1  [emitted]  One
   [0] ./OneEntry.js 81 {2} [built]
   [0] ./TwoEntry.js 113 {0} [built]
   [1] ./Dep.js 103 {1} {2} [built]
    + 4 hidden modules
Child extract-text-webpack-plugin:
        + 2 hidden modules
Hash: 33291634f4065e501d4e
Version: webpack 1.4.13
Time: 24ms
         Asset  Size  Chunks             Chunk Names
 1.1.bundle.js   332       1  [emitted]
 One.bundle.js  1886    2, 1  [emitted]  One
One.styles.css    30    2, 1  [emitted]  One
    + 7 hidden modules
Child extract-text-webpack-plugin:
        + 2 hidden modules
Hash: 2ed4f9458139cfb59089
Version: webpack 1.4.13
Time: 8ms
         Asset  Size  Chunks             Chunk Names
 1.1.bundle.js  1253       1  [emitted]
 One.bundle.js  2807    2, 1  [emitted]  One
One.styles.css    30    2, 1  [emitted]  One
    + 7 hidden modules

ERROR in /path/extract-text-plugin-bug-repro/node_modules/extract-text-webpack-plugin/loader.js?{"omit":1,"extract":true,"remove":true}!/path/extract-text-plugin-bug-repro/node_modules/style-loader/index.js!/path/extract-text-plugin-bug-repro/node_modules/css-loader/index.js!/path/extract-text-plugin-bug-repro/Dep.css doesn't export content

Problems when the same CSS @import is used in entry and on-demand chunks

If the CSS of a module contained in a loaded-on-demand chunk @import's a CSS file that was also imported by the CSS of a module in an entry chunk, the module that was created (by css-loader) is stripped from the output.

When the chunk is loaded, it throws an error because the import's module is missing from the build output. Also note the injection of this in the head of the document:

<style type="text/css">[object Object]</style>

(Note that this issue may be related to #11, and that the test case uses the style-loader separately in order to avoid the error from #11)

Test case

Only some CSS is getting written to disk

In my webpack.config.js file, this line is working great, it gets all of my various CSS files loaded, albeit inline in the webpage (which is a little insane for large files):

{ test: /\.css$/,    loader: 'style!css' },

on the same project, when I change that line to:

{ test: /\.css$/,    loader: ExtractTextPlugin.extract("style-loader", "css-loader") },

CSS files are created, but they only contain some of the dependencies.

Below is the full configuration. Am I missing something here or is this a bug?

var path = require("path");
var webpack = require("webpack");
var bower = require("bower-webpack-plugin");
var ExtractTextPlugin = require("extract-text-webpack-plugin");

var resolveBowerPath = function(componentPath) {
    return path.join(__dirname, 'bower_components', componentPath);
};

module.exports = {
    entry: {
        site: "./site-entry.js",
        manager: "./bower_components/opine-semantic-cm/manager-entry.js"
    },
    output: {
        path: __dirname + "/public/build",
        publicPath: "/build/",
        filename: "[name]-bundle.js",
        chunkFilename: "[name]-bundle.js"
    },
    module: {
        loaders: [
            //{ test: /\.css$/,    loader: 'style!css' },
            { test: /\.css$/,    loader: ExtractTextPlugin.extract("style-loader", "css-loader") },
            { test: /\.woff$/,   loader: 'url-loader?mimetype=application/font-woff' },
            { test: /\.ttf$/,    loader: 'url-loader?mimetype=application/font-ttf' },
            { test: /\.eot$/,    loader: 'url-loader?mimetype=application/font-eot' },
            { test: /\.svg$/,    loader: 'url-loader?mimetype=iamge/svg' },
            { test: /\.png$/,    loader: 'url-loader?mimetype=image/png' },
            { test: /\.jpg$/,    loader: 'url-loader?mimetype=image/jpg' },
            { test: /\.gif$/,    loader: 'url-loader?mimetype=image/gif' }
        ]
    },
    resolve: {
        root: [path.join(__dirname, "bower_components")],
        alias: {
            'jquery.ui.widget': resolveBowerPath('jquery-file-upload/js/vendor/jquery.ui.widget.js')
        }
    },
    plugins: [
        new bower(),
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            "windows.jQuery": "jquery",
            moment: "moment"
        }),
        new ExtractTextPlugin("ExtractTextPlugin", "[name]-style.css", {
            allChunks: true,
            publicPath: "/build/"
        })
    ]
};

npm install fails

❯ npm install extract-text-webpack-plugin
npm WARN package.json [email protected] No repository field.
npm WARN install Refusing to install extract-text-webpack-plugin as a dependency of itself

❯ npm --version
1.4.15

❯ node --version
v0.10.26

npm install webpack/extract-text-webpack-plugin works, but installing from the npm repository fails with the error above :(

Extracting text only for common chunks and not entries

I like extracting the text from the common chunks because that is where I put all of the heavy theming but I don't want to use this for the entries. I was just confusing myself because after lot of time I realized that I needed to include an additional CSS for that entry.

Is there anything that I can do about this?

issue for ExtractTextPlugin.extract

Hi I got some issue for ExtractTextPlugin.extract method, if run within else field will extract fail.
Not sure logic is correct?

// index.js
ExtractTextPlugin.extract = function(before, loader, options) {
    if(typeof loader === "string") {
        return [
            ExtractTextPlugin.loader(mergeOptions({omit: before.split("!").length, extract: true, remove: true}, options)),
            before,
            loader
        ].join("!");
    } else {
        loader = before;
        return [
            ExtractTextPlugin.loader(mergeOptions({remove: true}, options)),
            loader
        ].join("!");
    }
};

Inlined assets aren't removed from chunk

  1. Add a CSS to the initial chunk with some images
  2. Use url-loader for images

The CSS is correctly extracted and includes inlined images as well. But the initial chunk JS file still contains the modules with inlined images. They should be also removed in this case I think.

I use the same setup as in example.

peerDependencies conflict

npm ERR! node v0.10.32
npm ERR! npm  v2.0.0
npm ERR! code EPEERINVALID

npm ERR! peerinvalid The package webpack does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer [email protected] wants webpack@^1.4
npm ERR! peerinvalid Peer [email protected] wants [email protected]
npm ERR! peerinvalid Peer [email protected] wants webpack@^1.3.0

[email protected] wants webpack@^1.4 – version @1.4 without -beta is not exists, so @^1.4 doesn't match to anything. Downgrading it to @^1.3 fixes the problem, but I think that you must release a "stable" @1.4.0 version, this flow is not normal:

     '1.3.7': '2014-08-25T14:34:20.754Z',
     '1.4.0-beta1': '2014-08-27T15:19:52.742Z',
     '1.4.0-beta2': '2014-08-29T14:07:07.703Z',
     '1.4.0-beta3': '2014-09-03T12:16:23.569Z',
     '1.4.0-beta4': '2014-09-07T20:56:49.610Z',
     '1.4.0-beta5': '2014-09-10T12:08:56.832Z',
     '1.4.0-beta6': '2014-09-11T18:22:16.353Z',
     '1.4.0-beta7': '2014-09-15T11:25:44.687Z',
     '1.4.0-beta8': '2014-09-15T11:32:43.831Z',
     '1.4.0-beta9': '2014-09-16T17:35:26.891Z',
     '1.4.0-beta10': '2014-09-17T21:25:43.188Z',
     '1.4.1-beta1': '2014-09-19T06:12:47.347Z' },

Fails in combination with CommonsChunkPlugin

When running with the CommonsChunkPlugin activated I fail to build this error:

/Users/simme/Projects/ftl/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:149
                                throw e;
                                      ^
TypeError: Cannot read property '2' of undefined
    at Tapable.<anonymous> (/Users/simme/Projects/ftl/node_modules/webpack/lib/optimize/LimitChunkCountPlugin.js:45:12)
    at Tapable.applyPlugins (/Users/simme/Projects/ftl/node_modules/webpack/node_modules/tapable/lib/Tapable.js:26:37)
    at Tapable.seal (/Users/simme/Projects/ftl/node_modules/webpack/lib/Compilation.js:378:7)
    at Tapable.<anonymous> (/Users/simme/Projects/ftl/node_modules/webpack/lib/Compiler.js:379:15)
    at /Users/simme/Projects/ftl/node_modules/webpack/node_modules/tapable/lib/Tapable.js:114:11
    at Tapable.<anonymous> (/Users/simme/Projects/ftl/node_modules/webpack/lib/Compilation.js:351:10)
    at Tapable.<anonymous> (/Users/simme/Projects/ftl/node_modules/webpack/lib/Compilation.js:328:12)
    at /Users/simme/Projects/ftl/node_modules/webpack/lib/Compilation.js:260:10
    at Object.async.each (/Users/simme/Projects/ftl/node_modules/webpack/node_modules/async/lib/async.js:121:20)
    at Tapable.Compilation.addModuleDependencies (/Users/simme/Projects/ftl/node_modules/webpack/lib/Compilation.js:149:8)

This is my config:

var webpack = require('webpack');
var ExtractTextPlugin  = require('extract-text-webpack-plugin');

module.exports = {
  context: __dirname + '/assets/js/',
  entry: {
    popular: './popular.js'
  },
  output: {
    path: 'build',
    filename: '[name]-[hash].js',
  },
  resolve: {
    modulesDirectories: ['node_modules', 'bower_components']
  },
  module: {
    loaders: [
      {
        test: /\.scss$/,
        loaders: [
          'style-loader',
          ExtractTextPlugin.loader({remove:true}),
          'css-loader',
          'sass-loader',
        ]
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('style.css'),
  ],

  cache: true
};

Plugin doesn't seem to work with hash or chunkhash.

If I extract css but don't also change any javascript chunks, webpack will output css files with the same hashed filename even if they've actually changed. Let me know if this is a wontfix or you need more information!

0.3.3 doesn't work with webpack-dev-server

Editing CSS files triggers a recompilation, and the webpack console output still says the CSS files are emitted, but when you refresh the app it is still serving the CSS from the initial compilation when the dev server starts up.

No problems with changing JS, just with the assets that this plugin is extracting.

0.5.0 Still exhibits 0.4.0 bug

I tried to update to 0.5.0 this morning in the react-bootstrap repo. You can see the problem when you run npm run docs there. With 0.3.8 the top nav bar has a dark background. With 0.4.0 and 0.5.0 it has a white background. I haven't dug into the root of the problem yet, but both those versions do not seem to work.

Add Option for Post-Extract Processing

Hi,

I'm currently using this plugin to extract my .less files into a single CSS file for production. This works well, but there is one more step I'd like to go.

I'd like to have the Less code compiled to CSS after it was extracted. This way, only one (big) snippet of code gets compiled and all the @imported files only get imported once (like it's done when using plain CSS).

(If this is already possible, please let me know!)

IE9 Selector Limits

I have been using this plugin and it works really well on smaller sites. I'm running into a problem on a larger site where our commons bundle is getting more than 4095 rules. See IEs statement of limitation

My original goal with moving to this plugin was to support source maps of our styling to the less files that the styles came from.

Prior to using webpack we were using Mimosa with our own Bless css plugin https://github.com/DarthFubuMVC/mimosa-bless. While Bless may eventually be a solution, it does not support source maps yet.

Is there a way to still have each of our root less files go to their own css file and still be attributed to the bundle they get associated with?

[hash] segment

If I set filename to '[name]-[hash].css', the [hash] segment does not get interpolated, the output filename is:

styles-[hash].css

git clone https://github.com/glebm/gulp-webpack-react-bootstrap-sass-template && cd $_
npm install && bin/bower install
bin/gulp prod

Add timestamp to generated comment in stub module (behind an option flag?)

I am trying to get HMR working for css files generated by the plugin. I have a solution which isn't the most prettiest, but which would work if the generated stub module would be marked in as changed in the HMR frontend. The easiest solution i can think of there is actually modifying the stub module by adding the current timestamp to the generated comment. If there is another solution even better :)

relative urls to images in css point to the wrong place

I'm trying to compile a legacy css file. In this legacy file, there are relative url like `background-image: url(../images/cta-newsletter.png), which get resolved according to the location of the stylesheet. Unfortunately, the extract-text-plugin (or maybe one of the loaders?) will remove this relative url.
I use the url-loader for images like this:

{ test: /\.(png|jpg)$/,
  loader: 'url-loader?name=images/[name].[ext]&limit=8192' },

and the ExtractTextPlugin is added to the plugins array like this:

[..., new ExtractTextPlugin('css/[name].css'),]

so that compiled images and css files go into images and css respectively in the build dir, which mirrors what the src dir looks like.

Am I doing something wrong or crazy? Is there a way to have this plugin keep track of relative urls? Lemme know if this is unclear and I'll explain further.

Thank you!
Brian

Fatal error: Expected a SourceNode, string, or an array of SourceNodes and strings

Hi.

$ npm ls source-map
…
├─┬ [email protected]
│ └─┬ [email protected]
│   └─┬ [email protected]
│     └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│   └─┬ [email protected]
│     └── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│   └── [email protected]
├─┬ [email protected]
│ └── [email protected]
└─┬ [email protected]
  ├─┬ [email protected]
  │ └── [email protected]
  └─┬ [email protected]
    └── [email protected]

I know it's related to webpack/webpack#373, but If I trying to remove webpack from extract-text-webpack-plugin's devDependencies I got another error:

Loading "gruntfile.js" tasks...ERROR
>> Error: Cannot find module 'webpack/lib/SourceMapSource'

Please help to resolve it 😕

Update dependencies

For example, async is at 0.9 now. I'll put a PR together, just using this to track until then.

enabling source maps

I'm using the SourceMapDevToolPlugin for sourcemaps rather than the devtool config option. Is using devtool required by this plugin to get CSS sourcemaps?

Make extract-text-webpack-plugin re-entrant

I'm working on React Style (see experimental branch and also #8 is slightly related as I iterated form your suggestion).

TL;DR: it produces CSS from JS:

var ReactStyle = require('react-style')

var style = ReactStyle({
  color: 'red',
  backgroundColor: 'white'
})

Becomes:

.automatically_generated_class_name {
  color: 'red';
  background-color: 'white';
}

.
The problem arises when I use both css-loader and react-style-loader with extract-text-webpack-plugin (I need to combine both approaches b/c some legacy styles I still want to import via CSS modules, like bootstrap for example).

Because plugin compiles mini-bundle which includes all JS code (due to react-style-loader) it encounters css requires once more but b/c child compiler has no extract-text-webpack-plugin configured for itself but inherits all loaders from main compiler it fails. But more importantly I don't want to process CSS files during react style bundle compilation b/c such CSS files will be processed by another child compiler (a direct child of main compiler).

So my question is how to make/configure extract-text-webpack-plugin re-entrant so child compilers don't produce another child compilers.

CSS source maps no longer being output

At some point, extract-text-webpack-plugin, style-loader, and/or css-loader stopped outputting CSS source maps.

I've created a repo to demonstrate: css-source-map-test

If you run the webpack config from the example directory of this project, or the zip from issue #24, you can see the same result.

Steps to test:

git clone https://github.com/jordansexton/css-source-map-test.git
cd css-source-map-test
npm install
webpack

Expected output:

index.js
index.css
index.js.map
index.css.map

Actual output: (example gist)

index.js
index.css
index.js.map

I've verified this on three machines running node 0.12.2, iojs 1.6.4, and iojs 1.6.2. I believe CSS source maps were being output as of my testing last week, but something broke and I don't know what.

I've also tested this with css-loader 0.9.1 to check if recent changes broke it with no luck.

devtool:'source-map' cause emitting map file for less in very wrong place

Here is example project https://dl.dropboxusercontent.com/u/12126978/webpack-test.zip

To reproduce problem:

  • npm install
  • webpack
  • create syntax error in less/DRDashboard.less, like adding { parenthesis on wrong place, webpack will output error statement
  • correct this syntax error in DRDashboard.less
  • webpack generates map file that was not created before.. and also path is completely wrong:
Child extract-text-webpack-plugin:
                                                                                                                                                                                                                                                                                       Asset   Size  Chunks       Chunk Names
    /Users/athli/Devel/jesse/Dashboard/node_modules/extract-text-webpack-plugin /Users/athli/Devel/jesse/Dashboard/node_modules/css-loader/index.js!/Users/athli/Devel/jesse/Dashboard/node_modules/less-loader/index.js!/Users/athli/Devel/jesse/Dashboard/client/less/DRDashboard.less.map  77965               

I noticed that this issue happen only if devtool: 'source-map'. I would love to have map files also for less, but this option should apply only for js file, right? I guess that creating source map files for less is outstanding: webpack-contrib/less-loader#16 . So really not sure what happens here :-). Let me know if you can reproduce it.

Here is webpack config:

var ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
            entry: "./app.js",
            output: {
                path: "build",
                filename: "app.js"
            },

            stats: {
                // Configure the console output
                colors: true,
                modules: false,
                reasons: false
            },
            // stats: false disables the stats output

            cache: true,
            debug: true,
            devtool: 'source-map',

            //storeStatsTo: "xyz", // writes the status to a variable named xyz
            // you may use it later in grunt i.e. <%= xyz.hash %>

            progress: false, // Don't show progress
            // Defaults to true

            failOnError: false, // don't report error to grunt if webpack find errors
            // Use this if webpack errors are tolerable and grunt should continue

            watch: true, // use webpacks watcher
            // You need to keep the grunt process alive

            keepalive: true, // don't finish the grunt task
            // Use this in combination with the watch option

            module: {
                loaders: [
                    {
                        test: /\.less$/,
                        loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
                    },
                    {
                        test: /\.png$/,
                        loader: "url-loader?name=img/[name].[ext]&limit=8192"
                    },{
                        test: /\.(svg|ttf|eot|woff)$/,
                        loader: "file-loader?name=fonts/[name].[ext]"
                    }
                ]
            },
            plugins: [
                new ExtractTextPlugin("[name].css")
            ]
}


extract-text-webpack-plugin fails when using the master version

Probably this is related to my setup, but if I run the master version of extract-text-webpack-plugin it fails with the message:

TypeError: Expected a SourceNode, string, or an array of SourceNodes and strings. Got /******/ (function(modules) { // webpackBootstrap
...
at SourceNode_add [as add] (/Users/foo/Projects/extract-text-webpack-plugin/node_modules/source-map/lib/source-map/source-node.js:177:13)
    at Source.ConcatSource.add (/Users/foo/Projects/extract-text-webpack-plugin/node_modules/webpack/node_modules/webpack-core/lib/ConcatSource.js:22:14)
    at Source.<anonymous> (/Users/foo/Projects/extract-text-webpack-plugin/node_modules/webpack/node_modules/webpack-core/lib/ConcatSource.js:12:8)
    at Array.forEach (native)

css file not written when CommonsChunkPlugin active

Hi there.

While I am not getting any errors, the css file is not getting generated when I have the CommonsChunkPlugin activated. My CSS is not within a common chunk, FWIW. It appears as though the text is being extracted... just no css file.

Here's what I've got:

  commonsPlugin = new webpack.optimize.CommonsChunkPlugin 'common.bundle.js'

  extractText = new ExtractTextPlugin("main.css", {allChunks: true})

  config =
    entry: 
      main: "./src/main.coffee"
    output:
      publicPath: "/dist/"
      path: __dirname + "/dist"
      filename: "[name].bundle.js"
    module:
      loaders: [
        {test: /\.styl$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!stylus-loader")}
      ]
    plugins: [commonsPlugin, extractText]

  webpack config, (err, stats) ->
    throw new gutil.PluginError("webpack", err) if err
    gutil.log "[webpack]", stats.toString()
    cb()

Any ideas?

Reloading extracted css with hot module replacement

Is it possible to have hot module replacement for an extracted css file that I load via a css link tag in my html's head tag?
I have HMR working for my javascript but not sure how to make it work for extracted css.
This is my css related config:

entry:
    styles: ['webpack-dev-server/client?http://localhost:3001', 'webpack/hot/dev-server', './app.scss']
loaders: [
  {
    test: /\.scss$/
    loader: ExtractTextPlugin.extract "style-loader", "css-loader!sass-loader?" + JSON.stringify
      outputStyle: 'expanded'
      includePaths: [
        path.resolve __dirname, './app'
        path.resolve __dirname, './bower_components'
        require('node-bourbon').includePaths
        path.resolve __dirname, './vendor/css'
      ]
  }
plugins: [new ExtractTextPlugin "css/#{nameBundle}.css"]

Module order isn't preserve between builds

Hey there, I might be doing something wrong here but I noticed that every time I do a new build (without changing anything) the hash of my CSS is different and I can se chunks of the CSS shifting in order.

Given that CSS caching is one of the selling points outlined in the README, I think I'm doing something wrong, and I'm wondering if you guys have any insight/input on this. Cheers!

plugin produces a lot of empty logs while extracting

like this:

...
Child extract-text-webpack-plugin:

Child extract-text-webpack-plugin:

Child extract-text-webpack-plugin:

Child extract-text-webpack-plugin:

Child extract-text-webpack-plugin:
...

is it normal, or I had to see something useful? :)

Duplicate code in output

Say I have multiple components that require the same css file. When I use this plugin I get output file with multiple duplications of the contents of this file. Is there a way to prevent extracting files that were already extracted in the output file?

Add loader() method to documentation

Documentation (in README) does not mention loader() method which makes unclear if it is public and allowed to use.

However, this method is very useful for automatic config building:

  • it does not do any not fully clear actions extract() method does
  • with it it's easier to create the chain of loaders, especially if there are more than one of them before the extraction step
  • it allows to use remove and extract options which are really useful in some configurations
    • we are using {remove: false, extract: true} with hot loading, for example

common + vendor chunks and ExtractTextPlugin problem

hi.

I have a setup:

entry: {
    vendor: [ 'vendor-js', 'vendor-styles.css' ],
    a: './a.js',
    b: './b.js'
},
...
plugins: [
    new webpack.optimize.CommonsChunkPlugin({
        name: 'common',
        filename: 'build/js/[name].js',
        chunks: [ 'a', 'b' ]
    }),
    new webpack.optimize.CommonsChunkPlugin({
        name: 'vendor',
        filename: 'build/js/[name].js'
    }),
    new ExtractTextPlugin('build/css/[name].css', {
        allChunks: true
    })
]

JS files are generated fine, build/js/vendor.js contains "vendor-js", build/js/common.js contains shared between a.js and b.js modules, and so on:

build/js/
├── a.js
├── b.js
├── common.js
└── vendor.js

but CSS:

build/css/
└── vendor.css

build/css/vendor.css contains both vendor-styles.css and styles from build/js/common.js (styles required both in a.js and b.js). and there is no build/css/common.css.

is setup looks ok and this is a bug?

feat: support nested output paths

I'm having an issue when dealing with multiple entry bundles. While I can specify the path for the css file output for each bundle all the fonts in my CSS are just dumped to the base output path.

Plugin hangs when used with UglifyJS plugin

I'm not sure how to make a minimal repro for this... but when I upgraded from extract-text-webpack-plugin 0.3.1 to 0.3.2, my webpack build started hanging at 69% 477/478 build modules. When I downgrade this plugin back to 0.3.1, or turn off the UglifyJS plugin, it works again.

Any ideas? Happy to collect additional information if you tell me how.

I'm using this plugin for CSS, all default options. If it helps, my full plugin list is:

  • IgnorePlugin(...) (for a broken library)
  • NormalModuleReplacementPlugin(...) (for another broken library)
  • new ExtractTextPlugin("[name].css") (this is actually extracted into a variable and referenced in the css loader)
  • OccurenceOrderPlugin()
  • DedupePlugin()
  • AggresiveMergingPlugin()
  • CommonsChunkPlugin('common', 'common.js, null, 2)
  • UglifyJsPlugin()

Thanks!

Provide correct line numbers in stack traces of errors occurred during bundle eval

Currently if I execute non-trivial code in bundle produced by extract-text-webpack-plugin I get really verbose but uninformative stack traces:

ERROR in ./~/extract-text-webpack-plugin/loader.js?{"remove":true}!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!./index.js
Module build failed: Error: x
    at Object.eval (eval at <anonymous> (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:1868:2), <anonymous>:9:7)
    at Object.<anonymous> (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:1868:2)
    at __webpack_require__ (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:21:30)
    at Object.eval (eval at <anonymous> (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:50:2), <anonymous>:12:19)
    at Object.<anonymous> (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:50:2)
    at __webpack_require__ (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:21:30)
    at /Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:43:18
    at Object.<anonymous> (/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/entry.js!/Users/andreypopp/Workspace/react-style-webpack-plugin/lib/annotate.js!/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/jsx-loader/index.js?harmony!/Users/andreypopp/Workspace/react-style/examples/webpack/index.js:46:10)
    at Module._compile (module.js:456:26)
    at Object.loaderContext.exec (/Users/andreypopp/Workspace/react-style/examples/webpack/node_modules/webpack/node_modules/webpack-core/lib/NormalModuleMixin.js:86:7)

Wondering if this can be improved.

Multiple ExtractTextPlugins all output the same content

I might be doing something wrong here, but I can't seem to get multiple ExtractTextPlugins working. I want to have one plugin extract all my CSS and one to extract all the files containing text to translate (.po files).

With the following config:

var cssExtractTextPlugin = new ExtractTextPlugin(1, "[name].css");
var poExtractTextPlugin = new ExtractTextPlugin(2, "[name].po");

var config = {
  entry: {
    "standalone": "./src/standalone.js"
  },
  output: {
    path: path.join(__dirname, "dist"),
    filename: "[name].js"
  },
  module: {
    loaders: [
      {
        test: /\.less$/,
        loader: cssExtractTextPlugin.extract("style-loader", "css-loader!less-loader")
      }, {
        test: /\.po$/,
        loader: poExtractTextPlugin.extract("raw-loader", "raw-loader")
      }
    ]
  },
  plugins: [
    cssExtractTextPlugin,
    poExtractTextPlugin
  ],
  bail: true,
  cache: true
};

The generated .po and .css file both have the same content, they are both including all the CSS and text to translate.

I had hoped that I could have each one just extract the content from their own loaders. The docs seem to hint that this is possible.

I've created a repository (https://github.com/karl/webpack-issue-multiple-extract-text-plugins) which gives an example of the problem.

Any help greatly received!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.