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 🙏

© 2026 – Pkg Stats / Ryan Hefner

external-jsx-loader

v1.1.0

Published

A webpack loader to be used with standalone JSX files, in order to separate the component's logic from its template.

Readme

external-jsx-loader

A webpack loader to be used with standalone JSX files, in order to separate the component's logic from its template.


Install

npm install --save-dev external-jsx-loader

or (same thing, but shorter):

npm i -D external-jsx-loader

Usage

  1. Create your component same as before (Eg. my-component.js)
  2. Move the code (including the JSX tags) from the render() method to a new file (Eg. my-component.jsx)
  3. In your component's definition file, require the JSX file (Eg. const view = require('./my-component.jsx');)
  4. In the render() method, return view(this);
  5. Configure webpack to use the external-jsx loader for the template files, based on the file extension you chose for your templates

(See the sample "Hello World!" app in the demo folder)


Webpack config

The easiest way is to configure it as a pre-loader:

{
	module: {
		preLoaders: [
			{test: /\.jsx$/, loader: 'external-jsx' /*...*/}
		],

		loaders: [
			{test: /\.jsx?$/, loader: 'babel' /*...*/}
		]
	}
}

But you can configure it as a loader too:

{
	module: {
		loaders: [
			{test: /\.jsx$/, loader: 'babel!external-jsx' /*...*/},
			{test: /\.js$/,  loader: 'babel' /*...*/}
		]
	}
}

Either way, you have to make sure the loader is executed before the babel loader. (And yes, the babel loader will still have to be executed on the template files)


Example

File: my-component.js

const React = require('react');
const view  = require('./my-component.jsx'); // require the template

class MyComponent extends React.Component {
	constructor(props) {
		super(props);

		this.state  = {who: 'World'};
		this.greet  = this.greet.bind(this);
		this.update = this.update.bind(this);
	}

	greet(evt) {
		alert(`Hello ${this.state.who}`);
	}

	update(evt) {
		this.setState({who: evt.target.value});
	}

	render() {
		return view(this); // render the template passing `this` as the context
	}
}

module.exports = MyComponent;

File: my-component.jsx

<div>
	<h1>Hello!</h1>

	<input value={this.state.who} onChange={this.update} type="text" />
	<button onClick={this.greet}>Say hi!</button>
</div>

You can also require and use components in your template file or even have javascript code, just like before:

const AnotherComponent = require('./path/to/another-component.js');

<AnotherComponent>
	{/*if*/ (this.state.on) ? (
		<span className="lights-on">ON</span>
	)/*else*/ : (
		<span className="lights-off">OFF</span>
	)/*endif*/}
</AnotherComponent>

(the code you might have had in the render() method should be moved here if you really can't find a better place for it)