Plugin for generating ASP.NET Razor partial views for assets built with webpack.
npm install razor-partial-views-webpack-pluginPlugin for generating ASP.NET Razor partial views for assets built with webpack.
v4 for Rspack and webpack 5+
v3 for webpack v2-5
razor-partial-views-webpack-plugin use rules for generating cshtml/vbhtml views wrapping assets built with webpack. With the plugin comes templates for scripts and styles, but any type of asset can be used as Razor view source.
- npm install razor-partial-views-webpack-plugin --save-dev
- yarn add razor-partial-views-webpack-plugin --dev
To get familiar with the output from razor-partial-views-webpack-plugin, the quickest way is using the plugin's defaults, to generate partial views for all JavaScript and CSS.
``javascript`
// webpack.config.js
plugins: [new RazorPartialViewsWebpackPlugin()];
The templating process can be customized to fit the needs of your application. Here follows the configuration options that are supported.
`javascriptname
new RazorPartialViewsWebpackPlugin({
// "csharp" (default) or "vb"
target: "chsharp",
rules: [
{
// regex match asset filename(s)
// (takes precedence over )template
test: /(app|vendor).*\.js$/
},
{
// match asset by name
name: "runtime",
// no attributes in are required@ View generated ${new Date().toISOString()} @
template: {
// prepend header to view
header: () => "",
// usings in view
using: ["System", "System.Web"],
// view's model
model: "dynamic",
// append footer to view
footer: () => ,output
// if needed, use a custom template
path: path.join(__dirname, "templates/custom-template.tmpl"),
// in custom template, placeholder to find & replace with asset
// (default ##URL##/##SOURCE##)
replace: /##CONTENT-GOES-HERE##/
},
// not required, defaults to:generated-${defaultName}
// - webpack's output directory
// - load asset by URL
// - asset name from chunk name/filename
output: {
inline: true,
async: false,
defer: false,
// asset is ESM module
module: false,
// ...or fallback if module not supported
nomodule: false,
// assign predicable name to generated partial view
name: defaultName => ,`
// output view to custom location
path: path.join(__dirname, "Views/_GeneratedViews")
}
}
]
});
razor-partial-views-webpack-plugin supports referencing and inlining assets generated by webpack. Here follows an example configuration based on webpack's caching docs. A partial view for styles is also created.
`javascript
const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const RazorPartialViewsWebpackPlugin = require("razor-partial-views-webpack-plugin");
module.exports = {
entry: {
app: path.join(__dirname, "app.js")
},
output: {
path: path.join(__dirname, "dist"),
publicPath: "/dist/",
filename: "[name].[contenthash].js"
},
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader
},
"css-loader"
]
}
]
},
optimization: {
runtimeChunk: "single",
splitChunks: {
cacheGroups: {
defaultVendors: {
test: /[\\/]node_modules[\\/]/,
name: "vendors",
chunks: "all"
},
defaultStyles: {
name: "styles",
test: /\.css$/,
chunks: "all",
enforce: true
}
}
}
},
plugins: [
new MiniCssExtractPlugin({
filename: "[name].[contenthash].css",
ignoreOrder: false
}),
new RazorPartialViewsWebpackPlugin({
rules: [
{
name: ["app", "vendors", "styles"]
},
{
name: "runtime",
output: {
inline: true
}
}
]
})
]
};
`
Included in the plugin repository is an example webpack setup where various rules are used. By executing npm run example, partial views are created e.g. for inlining CSS and webpack's runtime.
When running your ASP.NET web site, the generated views will be compiled. Below follows a few tips to keep in mind:
- If you run into Compiler Error Message: CS0103: The name 'model' does not exist in the current context, this Stack Overflow answer guides you in the right direction.razor-partial-views-webpack-plugin
- If you're executing on a build server, make sure you've included the generated views' output directory in the artifact.
razor-partial-views-webpack-plugin is an extension of templated-assets-webpack-plugin`. For more configuration options and detailed control, use templated-assets-webpack-plugin.
- For feedback, bugs or change requests, please use Issues.
- For direct contact, tweet @jouni_kantola.