Итак, сейчас я работаю с прототипом, где мы используем комбинацию между webpack (для создания .tsx файлов и копирования .html файлов) и webpack-dev-server для разработки. Как вы можете предположить, мы также используем React и ReactDOM как пару зависимостей библиотеки. Наш текущий вывод сборки состоит из следующей структуры:
dist
-favicon.ico
-index.html
-main.js
-main.js.map // for source-mapping between tsx / js files
Это помещает ВСЕ модули (включая зависимости библиотек в большой связанный файл). Я хочу, чтобы конечный результат выглядел так:
dist
-favicon.ico
-index.html
-appName.js
-appName.min.js
-react.js
-react.min.js
-reactDOM.js
-reactDOM.min.js
У меня есть ссылки на каждую из библиотек в index.html и в операторах импорта в .tsx файлах. Поэтому мой вопрос в том, что... Как я могу перейти с webpack, создавая этот гигантский файл .js для отдельных файлов .js(включая библиотеки, не указывая их отдельно)? ** Бонус: я знаю, как делать флаги среды prod/dev, так как я просто минимизирую эти отдельные файлы (опять же, не связывая их)?
текущий webpack.config:
var webpack = require("webpack"); // Assigning node package of webpack dependency to var for later utilization
var path = require("path"); // // Assigning node package of path dependency to var for later utilization
module.exports = {
entry: [
"./wwwroot/app/appName.tsx", // Starting point of linking/compiling Typescript and dependencies, will need to add separate entry points in case of not deving SPA
"./wwwroot/index.html", // Starting point of including HTML and dependencies, will need to add separate entry points in case of not deving SPA
"./wwwroot/favicon.ico" // Input location for favicon
],
output: {
path: "./dist/", // Where we want to host files in local file directory structure
publicPath: "/", // Where we want files to appear in hosting (eventual resolution to: https://localhost:4444/)
filename: "appName.js" // What we want end compiled app JS file to be called
},
// Enable sourcemaps for debugging webpack output.
devtool: "source-map",
devServer: {
contentBase: './dist', // Copy and serve files from dist folder
port: 4444, // Host on localhost port 4444
// https: true, // Enable self-signed https/ssl cert debugging
colors: true // Enable color-coding for debugging (VS Code does not currently emit colors, so none will be present there)
},
resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [
"",
".ico",
".js",
".ts",
".tsx",
".web.js",
".webpack.js"
]
},
module: {
loaders: [
// This loader copies the index.html file & favicon.ico to the output directory.
{
test: /\.(html|ico)$/,
loader: 'file?name=[name].[ext]'
},
// All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'.
{
test: /\.tsx?$/,
loaders: ["ts-loader"]
}
],
preLoaders: [
// All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
{
test: /\.js$/,
loader: "source-map-loader"
}
]
},
// When importing a module whose path matches one of the following, just
// assume a corresponding global variable exists and use that instead.
// This is important because it allows us to avoid bundling all of our
// dependencies, which allows browsers to cache those libraries between builds.
// externals: {
// "react": "React",
// "react-dom": "ReactDOM",
// "redux": "Redux"
// }
};
Обновление: Закончился поиск решения, которое соответствует моим потребностям, хотя, опять же, в этом способе webpack-y требуется дополнительная настройка. Тем не менее хотелось бы сделать это немного более динамичным, но это улучшит это в более поздний момент времени. Резолюция, которую я искал, - это способность "обрезать" общие модули, но я заявил, что это имя файла, указанное "entry" -points, предоставленное в webpack. Я не возражал против объединения файлов, где это имело смысл, но хотелось, чтобы общие файлы находились на уровне компонентов, учитывая, что проект не был SPA (одностраничное приложение).
Дополнительный код оказался:
plugins: [
new webpack.optimize.CommonsChunkPlugin({ // This plugin is for extracting and created "chunks" (extracted parts of the code that are common and aren't page specific)
// One of these instances of plugins needs to be specified for EACH chunk file output desired
filename: "common.js", // Filename for this particular set of chunks to be stored
name: "common", // Entry point name given for where to pull all of the chunks
minChunks: 3 // Minimum number of chunks to be created
})
]
Мне также пришлось параметризовать точки входа (см. ниже, например), по имени переменной, чтобы я мог назначать модули реакции, реагирования и редукции в файл common.js.
entry: {
main: "./wwwroot/app/appName.tsx", // Starting point of linking/compiling Typescript and dependencies, will need to add separate entry points in case of not deving SPA
index: "./wwwroot/index.html", // Starting point of including HTML and dependencies, will need to add separate entry points in case of not deving SPA
favicon: "./wwwroot/favicon.ico", // Input location for favicon
common: [ "react", "react-dom", "redux" ] // All of the "chunks" to extract and place in common file for faster loading of common libraries between pages
},